经常会有一些Java的初学者问我一些非常简单的问题,而这些问题在许多Java教程上只是略微提到或者
根本就没有提到过。为了让初学者少走弯路,我把这些问题都列出来,希望初学者可以借鉴,也欢迎其他人
补充和指正。
下面是一个简单的例子:
public class Test{
public static void main(String[] args){
Test t = new Test();
t.showHello();
}
public void showHello(){
System.out.println("Hello world!");
}
}
1、在编译的时候经常会遇到这种错误。
G:\>javac test.java
test.java:1: class Test is public, should be declared in a file named Test.java
public class Test{
^
1 error
这是因为如果把类定义为Public类型,那么文件名必须和类名是一致的,注意是区分大小写的(也就意味着一
个文件只能有一个public类)。本例中的错误是因为大小写的问题,这类问题在Windows操作系统下经常会犯
的错误。Windows虽然不区分大小写文件,但是它会保存你输入文件名的时候的大小写格式。
把文件名改为Test.java,再编译就可以了。
2、运行的时候出现以下错误
G:\>java test
Exception in thread "main" java.lang.NoClassDefFoundError: test
这是因为classpath的设置不正确,把Test.class所在的目录加到classpath中,如果是在当前目录执行,那
么只需要将"."加到classpath里就行了。
3、运行的时候出现以下错误
G:\>java test
Exception in thread "main" java.lang.NoClassDefFoundError: test (wrong name: Test)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
这个错误还是因为大小写敏感的问题,把test->Test就可以了。
看看正确的输出结果:
G:\>java Test
Hello world!
本例中JDK的版本:
G:\>java -version
java version "1.4.1_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_02-b06)
Java HotSpot(TM) Client VM (build 1.4.1_02-b06, mixed mode)