资源描述
错误分析与问题解答
=====================================================================
错误信息:
>javac a.java
Note:a.java uses or overrides a deprecated API.
Note:Recomlile with -deprecation for details.
错误分析:
程序中包含了不提倡使用的类、属性或方法,因为已经有新的API替代了这些老的API。该信息只是一个提示性信息,一般并不影响程序的运行,但在以后的标本中可能就不支持了。最好还是用新的API替代旧的API。在API文档中,对这类过时的API都有说明,并给出对应的新API。
出现这类错误,可在编译时加上“-deprecation”选项,编译便可具体指出使用了旧API的语句及位置。
例如:
javac -deprecation a.java
a.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.
public class Hello
错误分析:
如果一个.java文件中包含public类的定义,该文件名必须与类名完全相同。该规定也同时说明了一个问题:即一个.java文件中只能包含一个public类定义。如果在你的程序中有多个public类需要定义,必须将它们分别放在各自的文件中。
例如本例中,源文件中定义了一个public类Hello,所以源文件名就必须是Hello.java而不能是a.java 。
=====================================================================
错误信息:
Exception in thread "main" java.lang.NoClassDefFoundError: ...
错误分析:
classpath变量中没有包含当前目录或类文件所在的目录。
=====================================================================
错误信息:
javac booktest.java
booktest.java:13:cannot resolve symbol
symbol : constructor BookCard(int,java.lang.String.book[])
location: class BookCard
BookCard bk=new BookCard(num,name,books2);
错误分析:
问题出现在BookCard类的构造函数。该类中的构造函数定义如下:
public class BookCard
{ private int rno;
private String rname;
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.java
javac -d . BookCard.java
均通过, 并生成了p文件夹, 查看里面有Book.class和BookCard.class两个文件.
然后在当前目录下运行:
javac booktest.java 却出错, 信息为: 找不到Book.class和BookCard.class
注:我的classpath设置为: set CLASSPATH=.;D:\program
files\jdk.2.2\lib\dt.jar;D:\program files\jdk.2.2\lib\tools.jar %
CLASSPATH, 并且以前引用系统类库时都没有问题.
解答:
1.类是public还不够,方法(包括构造方法)也必须是public的,才可以被包外调用。
2.包中类的源程序不要与调用包的源程序放在同一个目录下。
=====================================================================
问题:
我用了Point类的setLocation(x,y)和getX()、getY()两个方法, 出现一个很奇怪的问题: 明明声明的实参x y为double型的,但是setLocation(x,y)后,再用getX()、getY()返回其值,,结果把我原来的输入给四舍五入掉了, 查了半天也没找到原因...
解答:
Point类的两个属性x和y都是整型的。构造函数就只有整型参数。setLoction方法的参数及getX和getY的返回值只是以浮点数的形式表示点的坐标,但Point的属性决定了实际值。
代码实例:
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.0
3.0
=====================================================================
问题:
public class a{
public static void main(String[] 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呢? 而其他就相等呢?
解答:
第一个是常量形式,用一个内存单元保存
第二种情况是创建了两个字符串对象,虽然内容一样,但地址不一样,而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等属性的都会出现空指针错误。
正确的构造函数是:
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.java
I:\>javac -d . TestMystack.java
I:\>java TestMystack -classpath .\stack
Exception in thread "main" java.lang.NoClassDefFoundError: TestMystack
-----------------------
如果我进入stack文件夹中执行TestMystack.class,明明文件存在,也不能执行
I:\>cd stack
I:\stack>java TestMystack
Exception in thread "main" java.lang.NoClassDefFoundError: TestMystack (wrong na
me: stack/TestMystack)
at java.lang.ClassLoader.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.AccessController.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)
解答:
进入stack文件夹中执行TestMystack.class是不合理的,因为TestMystack程序中的package语句指定了有名的当前包(而不是当前目录的无名包了)。
要将测试程序与包分开,具体做法是:
① javac -d .Mystack.java
Mystack.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包都在当前目录下。
总之,要将使用包的程序(如测试程序)和包分开,和包中的类的源程序分开,不要搅到一起。
=====================================================================
展开阅读全文