编译器的问题
Microsoft Windows 系统中的公共错误消息
'javac' is not recognized as an internal or external command, operable program or batch file
/* 'javac' 不是被认可的内部或者外部命令,可操作程序或者批文件 */
如果你接收到这个错误,表示 Windows 不能找到编译器(javac)。
这里有一种方法来告诉 Windows 到哪里寻找 javac。假设你已经把 JDK 安装在 C:\jdk6 中。你就需要在命令行中输入下列命令并且按 Enter 键:
C:\jdk6\bin\javac HelloWorldApp.java
如果你选择这个选项,那么当你每次编译或者运行程序的时候,你都需要在你的 javac 与 java 命令的前面加上 C:\jdk6\bin\。如果要避免额外的输入,就可以考虑 JDK 6 安装说明中的[更新 PATH 变量]部分。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested
/* 类名 'HelloWorldApp' 只在注释处理明确被请求的时候才是可接受的 */
如果你接收到这个错误,表示你在编译程序的时候忘记了包括 .java 后缀。记住,命令行是 javac HelloWorldApp.java 而不是 javac HelloWorldApp。
UNIX 系统中的公共错误消息
javac: Command not found
/* javac:没有找到命令 */
如果你接收到这个错误,表示 UNIX 不能找到编译器(javac)。
这里有一种方法来告诉 UNIX 到哪里寻找 javac。假设你已经把 JDK 安装在 /usr/local/jdk6 中。那么你就需要在命令行中输入下列命令并且按 Return 键:
/usr/local/jdk6/javac HelloWorldApp.java
提示:如果你选择这个选项,那么当你每次编译或者运行程序的时候,你都需要在你的 javac 与 java 命令的前面加上 usr/local/jdk6/。如果要避免额外的输入,你就可以把这个信息添加到你的 PATH 变量中。并且这个任务的完成步骤也是不同的,这依赖于你当前运行的命令解释器。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested
/* 类名 'HelloWorldApp' 只在注释处理明确被请求的时候才是可接受的 */
如果你接收到这个错误,就有可能是你忘记了在编译程序的时候包括 .java 后缀。记住,命令是 javac HelloWorldApp.java 而不是 javac HelloWorldApp。
语法的错误(所有平台)
如果你错误地输入了程序的一部分,那么编译器就会发出一条语法错误。该消息经常显示了错误的类型、错误被检测到的行号,整行代码和代码中的错误位置。这里就是一个由于忽略了语句未尾部分的分号(;)而导致的错误:
testing.java:14: `;' expected.
System.out.println("Input has " + count + " chars.")
^
1 error
有时候编译器不能够猜测你的目的并且打印一条或者多条模糊的错误消息,如果错误层层覆盖了若干条代码行的话。例如,下列代码片断就在其中一行忽略了分号(;):
while (System.in.read() != -1)
count++
System.out.println("Input has " + count + " chars.");
在处理这个代码的时候,编译器会发出两条错误消息:
testing.java:13: Invalid type expression.
count++
^
testing.java:14: Invalid declaration.
System.out.println("Input has " + count + " chars.");
^
2 errors
编译器发出了两条错误消息,因为它在处理 count++ 的时候,编译器状态指出这个错误在一条表达式的中间。并且如果没有分号,编译器就没有办法知道语句已经结束了。
如果你发现了任何编译器错误,那么你的程序不能编译成功,并且编译器也不会创建 .class 文件。你应该仔细地对程序进行检验,并且修复能够被发现的任何错误,然后重新尝试编译。
分号的错误
除了检查你的程序的语法是否正确之外,编译器还会检查其他的基本内容是否正确。例如,编译器每次都会提醒你所使用的变量没有被初始化:
testing.java:13: Variable count may not have been initialized.
count++
^
testing.java:14: Variable count may not have been initialized.
System.out.println("Input has " + count + " chars.");
^
2 errors
并且你的程序不能编译成功,而编译器也不会创建 .class 文件。你需要修复这些错误然后重新尝试。
运行时的问题
Microsoft Windows 系统中的错误消息
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp
如果你接收到这条错误,那么就表示 java 不能找到你的字节码文件 HelloWorldApp.class。
Java 用来查找你的 .class 文件的位置就是你的当前目录。因此如果你的 .class 文件在 C:\java 中,那么你就应该把它改成当前目录。如果要改变你的目录,就可以在命令行中输入下列命令并且按 Enter 键:
cd c:\java
现在命令行应该变成了 C:\java>。如果你在命令行中输入 dir,你应该会看到你的 .java 与 .class 文件。现在重新输入命令 java HelloWorldApp。
如果你仍然发现有问题,你就需要改变你的 CLASSPATH 变量。如果要了解到这是必需的,你就可以用下列命令来尝试 classpath 的修复。
set CLASSPATH=
现在重新输入 java HelloWorldApp。如果程序在工作,就需要改变你的 CLASSPATH 变量。如果要设置这个变量,参考 JDK 6 安装说明中的[更新 PATH 变量]部分。CLASSPATH 变量的设置方式是相同的。
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class
初学的程序员所犯的一个公共错误就是尝试在由编译器所创建的 .class 文件中运行 java 运载器。例如,如果你尝试以 java HelloWorldApp.class 来替代 java HelloWorldApp 并且运行你的程序,你就会得到这条错误。记住,参数是你想要使用的类名称,而不是文件名。
Exception in thread "main" java.lang.NoSuchMethodError: main
Java VM 要求你所执行的类中有一个 main 方法来开始应用程序的执行。[近距离观察 Hello World! 应用程序]详细地讨论了 main 方法。
UNIX 系统中的错误消息
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp
如果你接收到这个错误,就表示 java 不能找到你的字节码文件 HelloWorldApp.class。
Java 尝试查找你的字节码文件的位置就是你的当前目录。例如,如果你的字节码文件在 /home/jdoe/java 中,那么你就应该把它改成你的当前目录。如果要改变你的目录,就需要在命令行中输入下列命令并且按 Return 键:
cd /home/jdoe/java
如果你在命令行中输入 pwd,你应该会看到 /home/jdoe/java。如果你在命令行中输入 ls,你应该会看到你的 .java 与 .class 文件。现在重新输入 java HelloWorldApp。
如果你仍然发现有问题,你可能需要改变你的 CLASSPATH 环境变量。如果要了解到这是必需的,可以用下列命令来尝试 classpath 的修复。
unset CLASSPATH
现在重新输入 java HelloWorldApp。如果程序在工作,你就需要改变你的 CLASSPATH 变量,以上面的 PATH 变量一样的方式。
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class
初学的程序员所犯的一种公共错误就是在由编译器所创建的 .class 文件中运行 java 运载器。例如,如果你尝试以 java HelloWorldApp.class 替代 java HelloWorldApp 并且运行你的程序,你就会得到这个错误。记住,参数是你想要使用的类名称,而不是文件名。
Exception in thread "main" java.lang.NoSuchMethodError: main
Java VM 要求你所执行的类中有一个 main 方法来开始应用程序的执行。[近距离观察 Hello World! 应用程序]中就详细地讨论了 main 方法。