1、错误分析与问题解答=错误信息:javac a.javaNote:a.java uses or overrides a deprecated API.Note:Recomlile with -deprecation for details.错误分析:程序中包含了不提倡使用的类、属性或方法,因为已经有新的 API 替代了这些老的API。该信息只是一个提示性信息,一般并不影响程序的运行,但在以后的标本中可能就不支持了。最好还是用新的 API 替代旧的 API。在 API 文档中,对这类过时的 API 都有说明,并给出对应的新 API。出现这类错误,可在编译时加上“-deprecation”选项,编译
2、便可具体指出使用了旧API 的语句及位置。例如:javac -deprecation a.javaa.java:6:warning:getDate() in java.util.Date has been deprecated System.out.println(d.getDate);1 warning 该例说明 Date 类的 getDate()方法属过时方法。从文档中可以查出,可用 Calendar.get方法替代。=错误信息: javac a.java class Hello is public,should be declared in a file named Hello.java
3、.public class Hello错误分析:如果一个.java 文件中包含 public 类的定义,该文件名必须与类名完全相同。该规定也同时说明了一个问题:即一个.java 文件中只能包含一个 public 类定义。如果在你的程序中有多个 public 类需要定义,必须将它们分别放在各自的文件中。例如本例中,源文件中定义了一个 public 类 Hello,所以源文件名就必须是 Hello.java 而不能是 a.java 。=错误信息:Exception in thread “main“ java.lang.NoClassDefFoundError: .错误分析:classpath 变量
4、中没有包含当前目录或类文件所在的目录。=错误信息:javac booktest.javabooktest.java:13:cannot resolve symbolsymbol : constructor BookCard(int,java.lang.String.book)location: class BookCardBookCard bk=new BookCard(num,name,books2);错误分析:问题出现在 BookCard 类的构造函数。该类中的构造函数定义如下:public class BookCard private int rno;private String rna
5、me;private book books;void BookCard(int p1,String p2,book p3) rno=p1;rname=p2;books=p3;.构造函数前不能有 void=问题:老师,我将 Book 类和 BookCard 类分别定义为 public, 并放在两个文件中, 并且都加了一个 package 语句: package p , 并编了一个测试程序 booktest.java,其中加上 import p.*语句, 放在当前目录下. 开始编译运行过程, 如下: javac -d . Book.javajavac -d . BookCard.java均通过,
6、并生成了 p 文件夹, 查看里面有 Book.class 和 BookCard.class 两个文件.然后在当前目录下运行:javac booktest.java 却出错, 信息为 : 找不到 Book.class 和 BookCard.class注:我的 classpath 设置为: set CLASSPATH=.;D:program filesjdk.2.2libdt.jar;D:program filesjdk.2.2libtools.jar %CLASSPATH, 并且以前引用系统类库时都没有问题 .解答:1.类是 public 还不够,方法(包括构造方法)也必须是 public 的,
7、才可以被包外调用。2.包中类的源程序不要与调用包的源程序放在同一个目录下。=问题:我用了 Point 类的 setLocation(x,y)和 getX()、getY() 两个方法, 出现一个很奇怪的问题: 明明声明的实参 x y 为 double 型的,但是 setLocation(x,y)后,再用 getX()、getY()返回其值,结果把我原来的输入给四舍五入掉了, 查了半天也没找到原因.解答:Point 类的两个属性 x 和 y 都是整型的。构造函数就只有整型参数。setLoction 方法的参数及 getX 和 getY 的返回值只是以浮点数的形式表示点的坐标,但 Point 的属性
8、决定了实际值。代码实例:import java.awt.Point; public class test public static void main (String args) Point pt1=new Point(1,2);pt1.setLocation(1.23,2.78);System.out.println(pt1.getX();System.out.println(pt1.getY(); / end of main method / end of main class输出:1.03.0=问题:public class apublic static void main(Strin
9、g args)String s1,s2 ;s1=“abc“;s2=“abc“;if (s1=s2) System.out.println(“-1-“);s1=new String(“abc“);s2=new String(“abc“);if (s1=s2) System.out.println(“-2-“);if(s1.equals(s2) System.out.println(“-3-“);其中: if (s1=s2) System.out.println(“-2-“);为什么这里 s1 不等 s2 呢? 而其他就相等呢?解答:第一个是常量形式,用一个内存单元保存第二种情况是创建了两个字符串
10、对象,虽然内容一样,但地址不一样,而 s1 和 s2 分别保存了这两个地址,所以 s1 和 s2 不等.=问题 1:为什么程序执行时,当方法访问到属性时,就出现空指针错误?class BookCard int rno;String rname;Vector bBook;BookCard(int a,String b,Vector c) int rno=a; String rname=b;Vector bBook=c; 在构造函数中,对三个属性又进行了一次定义,相当于定义了三个局部变量,结果是对三个局部变量赋值,而并没有对三个属性赋值。所以下面的各方法中凡是用到 bBook 等属性的都会出现空指
11、针错误。正确的构造函数是:BookCard(int a,String b,Vector c) rno=a; rname=b;bBook=c;=问题:我在做第五次作业时,不能执行自己建的包中的类,请问老师是为什么?执行过程如下:我将 Mystack 等四个类加入 stack 包中程序开头写:package stack;测试文件写成一个.java,为了可以调用 stack 包中的四个类,也将它加入 stack 包中,程序开头写:package stack;编译时出错:I:javac -d . Mystack.javaI:javac -d . TestMystack.javaI:java TestM
12、ystack -classpath .stackException in thread “main“ java.lang.NoClassDefFoundError: TestMystack如果我进入 stack 文件夹中执行 TestMystack.class,明明文件存在,也不能执行I:cd stackI:stackjava TestMystackException in thread “main“ java.lang.NoClassDefFoundError: TestMystack (wrong name: stack/TestMystack)at java.lang.ClassLoad
13、er.defineClass0(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader.defineClass(Unknown Source)at .URLClassLoader.defineClass(Unknown Source)at .URLClassLoader.access$100(Unknown Source)at .URLClassLoader$1.run(Unknown Source)at java.security.AccessCo
14、ntroller.doPrivileged(Native Method)at .URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClassInternal(Unknown Source)解
15、答:进入 stack 文件夹中执行 TestMystack.class 是不合理的,因为 TestMystack 程序中的package 语句指定了有名的当前包(而不是当前目录的无名包了) 。要将测试程序与包分开,具体做法是: javac -d .Mystack.javaMystack.class 会出现在当前目录的 stack 目录下。还要注意:不要将放入包中的那些类的源程序(如 Mystack.java)与测试程序放在一起。例如:可以在当前目录下建一个 source 目录,然后将 Mystack.java 移到 source 目录下。将 TestMystack.java 中的 package stack 改为 import stack ,然后编译:javac TestMystack.java会在当前目录下生成 TestMystack.class 文件执行java TestMystack注意:classpath 要包括当前目录,因为在该例中 TestMystack.class 类文件和程序中打开的 stack 包都在当前目录下。总之,要将使用包的程序(如测试程序)和包分开,和包中的类的源程序分开,不要搅到一起。=