JAVA常见问题以及解决方法(二)

13.运行下列程序出现了这样的错误,这是线程的知识,一个线程如果启动了,再启动一个的时候就会报错:java.lang.IllegalThreadStateException 程序如下:class thrund extends Thread{private S...

13.运行下列程序出现了这样的错误,这是线程的知识,一个线程如果启动了,再启动一个的时候就会报错:java.lang.IllegalThreadStateException
 程序如下:class thrund extends Thread{
private String name;
public thrund(String name){
this.name=name;
}

public void run(){   //线程完成的动作
for(int j=0;j<4;j++){
System.out.println(name+"第"+j+"个");
}
}
};
public class a {
    public static void main(String agrs[]){
    thrund th1=new  thrund("线程A");//实例化一个线程对象
    
    th1.start();   //调用线程主体
    th1.start(); //调用线程主体
    
    }
};
     运行结果如下:
 
  14.The public type abc must be defined in its own file这样的警告是出现在我下面这样的程序中的:
     
      所以我在百度上输入这样的问题:java程序中两个类为什么不能同时有public(其中有一个是主方法)?
      得到的回答是这样的:
     因为一个GM规定一个类中只能有一个PUBLIC 的  而且源文件的名字只能和PUBLKIC 属性的类去一个名字。
     另一种回答是这样的:同个源文件有多个公共类,编译器就找不到应该执行的main方法了
 15.运行下列泛型程序时,出现一下错误:
     程序:class add<T>{


private T y;
public T p(T y){
System.out.println(y);
return y;
}
}
public class a{
public static void main (String args[]){
add <String> adder=new add<String>();
//System.out.println("输出属性"+adder.getX());
//adder.p("你好,邱林和");
fun(adder);
public static void fun(add<?> temp){
System.out.println("内容"+temp);
}
}
}
      出现了如下错误:


     其中这个void is an invalid type for the variable fun这个错误的解释时:   
      第一步:检查拼写是否错误;
第二步:检查void actionPerformed(ActionEvent ae){}函数的位置,不能让它嵌套在别的函数里。我不知道为什么,但我这样改对了。
     通过这个观察上述代码确实发现这个fun方法被包含在了主方法中,所以导致这个错误,改成下列程序后,程序运行结果如下:
    
    public class a{
public static void main (String args[]){
add <String> adder=new add<String>();
//System.out.println("输出属性"+adder.getX());
//adder.p("你好,邱林和");
fun(adder);
}//一开始这个}被放在了fun函数下面,所以导致了这个错误。
public static void fun(add<?> temp){
System.out.println("内容"+temp);
}

}
      运行结果如下:


16.错误:java:Syntax error on token ";", , expected
17.解释是这样的:int b=3;
b=b-2;
应为这2行代码写的地方还处在声明定义阶段处。
就好象你脑子里想象着我有3块钱(第一行),但是又立马用这想象的3快去买物品(第二行)
所以卖东西的人肯定会说你(报错).


就是说,b=b-2这行代码处的位置  还处于声明阶段,没有在内存中给他划分空间,你是不能操作的。要么声明为静态的,提前划分空间
17,运行以下程序时,报错:
程序为:
public class a{
public static void main(String args[]){
Runtime run= Runtime.getRuntime();
System.out.println("JVM 最大内存量:"+run.maxMemory());
Process pro=null;   //声明一个Process对象,接收启动的进程
try{
pro=run.exec("Thunder.exe");   //调用本机程序,必须进行异常处理
}catch(Exception e){      //打印异常信息
e.printStackTrace();
}
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
pro.destroy();  //结束此进程

}
}  
  运行结果为:


这一句有问题,pro=run.exec("Thunder.exe");   //调用本机程序,必须进行异常处理  ,里面的Thunder.exe改成”notepad“就有用,不知道为什么?
18.java.lang.ArrayStoreException
      当运行下列程序时出现了这样的错误:
       import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;


public class a{
public static void main(String args[]){
List<Integer> al=null;     //定义List对象
Collection<Integer>  cl=null; //定义Collention对象
al=new ArrayList<Integer>();  //实例化List对象,只能是Integer
cl=new ArrayList<Integer>();   //实例化Collection对象,只能是Integer
al.add(0, 34);     //在指定位置增加元素
al.add(1,343);
   System.out.println(al);
   cl.add(5654);
   cl.add(3434);
   System.out.println(cl);
   al.addAll(cl);    //从Collection继承的方法,增加一组对象
   String str[]=al.toArray(new String[] {});   //指定的泛型类型
   System.out.print("指定数组类型"); //信息输出
   for(int  i=0;i<str.length;i++){   //输出字符串数组中的内容
   System.out.print(str[i]+"、");
   }
  System.out.print("\n 返回对象数组:");//信息输出
   Object obj[]=al.toArray();    //直接返回对象数组
   for(int i=0;i<obj.length;i++){      //循环输出对象数组内容
   String  temp=(String) obj[i];    //每一个对象都是String类型实例
   System.out.print(temp+"、");
   }
}
}   
      程序运行结果如下:
      当你试图将错误类型的对象存储到一个对象数组时抛出的异常。例如,以下代码可生成一个 ArrayStoreException: 
   Object x[] = new String[3];
     x[0] = new Integer(0);
就这么简单。
怎么避免呢?关键就是元素的内容要正确。
你看你的代码:
private Object[] objects;
....
objects = new ObjectSet[size];
很明显这里用父类的引用指向了子类的实现。
那么给每个元素赋值的时候只能付这个子类对象及这个子类的后代。
你又将OBJECT赋值给它,那么就必须向下转型。
上述程序的解决办法是:    
      把:” List<Integer> al=null;     //定义List对象
Collection<Integer>  cl=null; //定义Collention对象
al=new ArrayList<Integer>();  //实例化List对象,只能是Integer
cl=new ArrayList<Integer>();   //实例化Collection对象,只能是Integer“  语句中的Integer都改成String就可以了
18.address already in use: jvm_bind
在运行服务器和客户端程序的时候出现下面的错误:
   可能运行错误的原因有:通常出现Address already in use: JVM_Bind错误的可能性分析
I.就是当前端口已经有别的程序在占用着,所以要么把占用这个端口的程序关闭,要么重新换一个端口
II.端口号被占用,如果你有装oracle的话,有可能是oracle使用了8080端口,oracle安装后并且如果启动了OracleHttp服务会占用8080端口
III.我认为很可能是多启动了几次TOMCAT,在ECLIPSE下重复启动TOMCAT就会出现这个问题,你去调查一下看看是否是这个原因.
IV.如果不是windows操作系统,那么80端口已经被占用.如果是windows操作系统.请检查是否装有IIS.
V.启动了多个Tomcat。
我就是因为启动了两个Tomcat,所以才会报这样的错误,通常情况下, 多次启动Tomcat或者非正常关闭Myeclipse,但是占用端口的进程没有关闭,也会出现这样的错误。解决方法是关闭javaw.exe进程。


源程序是:
服务器端程序:
     package a;
import java.net.*;
import java.io.*;
public class Server{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server(){
try{
//在服务器端指定端口10000创建队列长度为50的服务器端套接字
ss=new ServerSocket(10000);
while(true){
//告诉服务器不停地等待,直到有客户端连接到该Serversocket指定的端口
//一旦有客户端通过网络向该端口发送正确的连接请求
//该方法就会返回表示服务器与客户端连接已建立的Socket对象
socket=ss.accept();
String clientIP=socket.getInetAddress().getHostAddress();
String clientPort=":"+socket.getLocalPort();
System.out.println("A client come in !IP:"+clientIP+clientPort);
//获得客户端发送的信息
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=in.readLine();
System.out.println("Client send is:"+line);
//给客户端Socket 发送回应信息
out=new PrintWriter(socket.getOutputStream(),true);
out.println("Server:Your Message Received!");
//关闭资源
out.close();
in.close();
socket.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String args[]){
new Server();
}
}
   客户端程序:
package a;
import java.io.*;
import java.net.*;
public class Client {
    Socket socket;
    BufferedReader in;
    PrintWriter out;
    public Client(){
    try{
    //连接服务器端的Socket
    
        socket=new Socket("127.0.0.1",10000);
        //读取输入字符,输出到服务器端Socket中
        System.out.println("Please enter some Character");
        BufferedReader line=new BufferedReader(new InputStreamReader(System.in));
        out=new PrintWriter(socket.getOutputStream(),true);
        //读取从服务器端socket输入的信息
        in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(in.readLine());
        
        //关闭资源
        out.close();
        in.close();
        socket.close();
        
       }catch(IOException e){
     e.printStackTrace();
      }
    }
     public static void main(String args[]){
    new Client();
     }
}


      运行时,错误时这样的:
        java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:96)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:175)
at java.net.ServerSocket.bind(ServerSocket.java:376)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at a.Server.<init>(Server.java:12)
at a.Server.main(Server.java:38)


   解决的办法是下面这样的:
满意回答
Reason:
Address already in use:JVM_Bind
原因:
JVM已经被占用了。


你是不是有其他的Java项目(程序)在运行中,结束了他们就好了。
在运行你想要调试的项目前,要确保JVM是处于Stop状态的。 


LZ你写的是不是web项目啊,如果不是上面的原因的话,那就是端口冲突了,LZ的是不是这个异常:
java.net.BindException: Address already in use: JVM_Bind


这个错误的原因是当前程序里用到的端口已经被其他程序占用,例如,我们在eclipse里新建一个socket和serversocket进行通信,在这里面会用到端口号,当运行时,报这个这个错误,那么就是socket里的端口号与外面的程序如Oracle、tomcat 的端口号相同,办法就改掉socket里的端口,或者改tomcat 里的web.xml中的端口号就ok了。
      但是没有解决这个错误,把端口3000改成8000后,运行后的结果为:
     Please enter some Character
          rtrttrtrtrtrt
          null
      19.错误调试:class cannot be resolved to a type 或者JSP import class cannot be resolved to a type
错误调试解析:class cannot be resolved to a type 或者JSP import class cannot be resolved to a type
import XXX.XXX cannot be resolved to a type , import XXX.XXX cannot be resolved错误处理解析
类的引用不可定义为一种。
出现这种问题的情况一般是你的引用出现了二义性。
比如你引用了classes.pack.num1,但是你同时在根文件夹下有一个classes的文件夹,和把此classes文件打包成的jar包,又或者你的classpath环境变量配置的过程中同时出现了路径"."和“XXX.jar”而有两个同名同路径的.class文件可以被找到,就会引发此问题。
很多时候用vi编辑.java文件的时候,默认使用的编译存放路径是".",就是说同目录下。
eclipse工程中默认.java文件的位置是src,编译文件.class的位置是classes,这种情况下, 使用手动测试的时候会出现在src的文件夹下也会生成出.class文件,如果系统环境变量中有classpath="."的定义时,再次使用eclipse编译时,就会出现class cannot be resolved to a type,因为同时可以找到两个同名同路径的.class文件。JSP impot class cannot be resolved to a type我的问题出在eclipse编译时把.class文件放在了classes文件夹下,但是tomcat去找的时候,只找了"."文件夹,结果就找不到。而在编写的时候,eclipse是能找到的,所以编写时不报错,运行时报错。如果你在.文件夹下也生成.class文件,tomcat能找到了,eclipse又找重了,还是不行。我的解决办法是,在tomcat启动时,为tomcat添加引用路径,先把classes文件夹导入到JVM中。tomcat在调用类的时候,就不会找不到了。具体操作方法是,使用eclipse的tomcat插件,在eclipse的主界面菜单window下的preferences对话框中找到tomcat插件的那一项,选择JVMsetting,有一个classpath(before generated classpath)中,导入你的classes文件夹。就可解决此问题。
相同的,如果tomcat运行时出现了找不到引用的jar包,也可以在这里设置导入。
后来发现经过myEclipse编译过的带有tomcat属性的文件会自动生成.class文件到目标工程,$tomcat\webapps\$project\web-inf\classes文件夹下。如果你的tomcat的配置文件路径设置正确的话,MyEclipse在调试,或者tomcat单独启动的时候,读取的就是该文件夹下的.class文件。如果你的tomcat的配置文件使用的是工程的绝对路径,并指向你的MyE的工作目录workspase的时候,就要注意在调试和发布的时候,一定别忘了把你编译好的.class文件考入相应的包下。否则tomcat会报此错或者class not found的错误。
如果还不对,请检查系统环境变量class_path是不是重复设置了可以导致二义性的路径。
或者是原有的同包,同名的类的拷贝版被加入了路径。
WEB-INF\classes 
class cannot be resolved to a type 问题的解决(2011-12-01 13:42:36)转载▼标签: it 分类: Java  
错误:class cannot be resolved to a type 或者JSP import class cannot be resolved to a type
import XXX.XXX cannot be resolved to a type , import XXX.XXX cannot be resolved


错误原因:引用出现了二义性。也就是说在你的工程中存在两个用于存放.class文件的classes文件夹,而加载tomcat的时候,tomcat的路径是不确定的,也可能找到了根本没有存放这个类的classes文件夹


解决方法:网上查到的解决办法是在tomcat启动时,为tomcat添加引用路径,先把classes文件夹导入到JVM中。tomcat在调用类的时候,就不会找不到了。具体操作方法是,使用eclipse的tomcat插件,在eclipse的主界面菜单window下的preferences对话框中找到tomcat插件的那一项,选择JVMsetting,有一个classpath(before generated classpath)中,导入你的classes文件夹。就可解决此问题。但是我使用的MyEclipse,这里边用到的是自带的Tomcat,跟上边提到的配置方式不太一样。我是修改了工程的文件目录,在新建此工程的时候默认的WEB板块的名称是WebRoot,之后我为了条理清楚,新建了一个Folder用来存放我的JSP文件,此时就有两个classes文件夹,一个是我新建的Folder对应的,另一个是原有的WebRoot的,所以应该把WebRoot删去,避免混淆(看到一本书上讲JavaBean设定时也是这么说的,要删去原有的,避免混淆)。






      20NumberFormatException异常 
1. 对应String类型的对象使用println()方法时,如果对象为null,将打印null而不是引发NullPointerException,由此引用的问题是容易造成错觉,对于以后对字符串的操作容易引起问题。
2. 引发NullPointerException异常,主要原因是没有对对象的存在性进行验证,在jsp编程中经常出现:if (request.getParameter(“username”).equals(“xxx”))、 out.println(session.getAttribute(“record”))等。解决这个问题的方法是在使用前进行判空比较:if (request.getParameter(“username”)!=null) {if if (request.getParameter(“username”).equals(“xxx”))…}。
3. 引发NumberFormatException异常:主要原因是将用户提交的内容转换为整数或者浮点数时用户输入了其它非法字符。处理的主要方式是在需要进行转换的地方使用try/catch块捕获此异常然后提示用户输入合法数据。
4. 引发StringIndexOutOfBoundsException异常:主要原因是使用String的substring()、charAt()等方 法,而字符串的长度不够,就会引发此异常;在字符串为null时也会引发NullPointerException。解决的方法是判空,判断长度或者转换 为字节数组。考虑到这些操作很多,可以将之封装到javabean中。
5. 引发NoClassDefFoundError错误,主要原因是类路径或者类文件放置错误,类文件的放置要符合服务器的要求。
6. 引发java.lang.Error错误,主要原因是对系统所访问外部资源,未执行关闭操作,导致外部资源大量浪费,最终可能导致系统无法正常运行;对系 统所访问的外部资源关闭次数太多,外部系统无法正常处理;所系统访问的外部资源出现异常情况。解决的方法是:访问外部资源前,首先检查该资源(如数据库) 是否可正常连接或操作;访问外部资源时,如果进行了连接,一定进行关闭操作,并仅进行一次关闭操作;尽量在同一操作中共享外部资源,以减少该操作对资源的 消费,提高程序的执行效率。


      21.eclipse 遇关键字enum编译问题解决
今天公司系统升级 JDK1.4 到 JDK1.5, 结果工程在eclipse中编译不能通过:
Enumeration enum = …………
但是eclipse报错:
Multiple markers at this line
- Enumeration cannot be resolved
- Syntax error on token "enum", delete this token
原因是在 JDK1.5 中,enum 被定义为关键字,这样就和在 JDK1.4自编写的代码冲突。
最简单的解决办法是,把变量改名为(enum1,enum2等),以回避关键字。
但是对于workflow复杂的公司来说,每修改代码都需要提交很复杂的JOB,还有另外一种解决办法。
在eclipse中,右键点击工程,Properities->Java Compiler
选择 Enable project specific settings
JDK Compliance
Complier compliance level: 1.4
选择 Use default compliance settings
OK
这样设置能使工程在标签识别的时候识别按照 JDK1.4 来识别,又不影响 JDK升级,而且不必修改代码,原来的代码可以在 JDK1.5 正常运行,我就是这么做的,如果有需要,你们也可以试试 :)
 22.Cannot make a static reference to the non-static method
在static函式中只能呼叫static成員(資料成員或函式成員)?例如在main()函式中
eg.
public static void main(String[] args) {
 String a = "abc";
 System.out.println(printClassName(a));
}
 public static String printClassName(String obj){ //if there is no "static",it will appears the wrong of "Cannot make a static reference to the non-static method printClassName(String)"
 return "The class of " + obj +
 " is " + obj.getClass().getName();
 }
#Java
Cannot make a static reference to the non-static method 解决
  在一个类中写了一个public void getDate()方法和一个main方法,在main方法中直接调用getDate()方法,于是就出现了这个错误提示。后来实例化类,再用实例化的类调用getDate()方法就没问题了。
     在静态方法中,不能直接访问非静态成员(包括方法和变量)。 因为,非静态的变量是依赖于对象存在的,对象必须实例化之后,它的变量才会在内存中存在。例如一个类 Student 表示学生,它有一个变量 String address。如果这个类没有被实例化,则它的 address 变量也就不存在。而非静态方法需要访问非静态变量,所以对非静态方法的访问也是针对某一个具体的对象的方法进行的。对它的访问一般通过 objectName.methodName(args......) 的方式进行。 而静态成员不依赖于对象存在,即使是类所属的对象不存在,也可以被访问,它对整个进程而言是全局的。因此,在静态方法内部是不可以直接访问非静态成员的。


23.struts2下的“Exception starting filter struts2”错误的问题
最近开始学习struts2,配置好了运行的时候总是有如下的错误:
严重: Exception starting filter struts2
java.lang.NoClassDefFoundError: Lorg/codehaus/plexus/PlexusContainer;
 at java.lang.Class.getDeclaredFields0(Native Method)
 at java.lang.Class.privateGetDeclaredFields(Class.java:2291)
 at java.lang.Class.getDeclaredFields(Class.java:1743)
 at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:102)
 at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:84)
 at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:82)
 at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:155)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

  • 发表于 2017-11-17 20:14
  • 阅读 ( 1629 )
  • 分类:Java

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
HJ社区-肖峰

IT

29 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章