类:常见问题(及其解决方案)
Compiler Problems
Microsoft Windows 系统上的常见错误消息
'javac' is not recognized as an internal or external command, operable program or batch file
如果收到此错误,则 Windows 将找不到编译器(javac
)。
这是告诉 Windows 在哪里找到javac
的一种方法。假设您在C:\jdk1.8.0
中安装了 JDK。在提示符下,键入以下命令,然后按 Enter:
C:\jdk1.8.0\bin\javac HelloWorldApp.java
如果选择此选项,则每次编译或运行程序时,都必须在javac
和java
命令之前加上C:\jdk1.8.0\bin\
。为了避免这种额外的 Importing,请查阅 JDK 8 安装说明中的更新 PATH 变量部分。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested
如果收到此错误,则在编译程序时忘记包含.java
后缀。请记住,命令是javac HelloWorldApp.java
而不是javac HelloWorldApp
。
UNIX 系统上的常见错误消息
javac: Command not found
如果收到此错误,则 UNIX 无法找到编译器javac
。
这是告诉 UNIX 在哪里找到javac
的一种方法。假设您在/usr/local/jdk1.8.0
中安装了 JDK。在提示符下,键入以下命令,然后按 Return 键:
/usr/local/jdk1.8.0/javac HelloWorldApp.java
注意: 如果选择此选项,则每次编译或运行程序时,都必须在javac
和java
命令之前加上/usr/local/jdk1.8.0/
。为了避免这种额外的 Importing,您可以将此信息添加到 PATH 变量中。这样做的步骤将根据您当前正在运行的 Shell 而有所不同。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested
如果收到此错误,则在编译程序时忘记包含.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
文件。仔细验证程序,修复检测到的所有错误,然后重试。
Semantic Errors
除了验证程序在语法上是正确的之外,编译器还会检查其他基本正确性。例如,每次您使用未初始化的变量时,编译器都会警告您:
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
文件。解决错误,然后重试。
Runtime Problems
Microsoft Windows 系统上的错误消息
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp
如果收到此错误,则java
找不到字节码文件HelloWorldApp.class
。
java
试图找到.class
文件的地方之一是当前目录。因此,如果.class
文件位于C:\java
中,则应将当前目录更改为该目录。要更改目录,请在提示符下键入以下命令,然后按 Enter:
cd c:\java
提示应更改为C:\java>
。如果在提示符下 Importingdir
,则应该看到.java
和.class
文件。现在再次 Importingjava HelloWorldApp
。
如果仍然有问题,则可能必须更改 CLASSPATH 变量。要查看是否有必要,请try使用以下命令破坏 Classpath。
set CLASSPATH=
现在再次 Importingjava HelloWorldApp
。如果程序现在可以运行,则必须更改 CLASSPATH 变量。要设置此变量,请参阅 JDK 8 安装说明中的更新 PATH 变量部分。 CLASSPATH 变量的设置方式相同。
Could not find or load main class HelloWorldApp.class
Starters 程序员经常犯的一个错误是try在由编译器创建的.class
文件上运行java
启动器。例如,如果try使用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
如果在提示符下 Importingpwd
,则应看到/home/jdoe/java
。如果在提示符下 Importingls
,则应该看到.java
和.class
文件。现在再次 Importingjava HelloWorldApp
。
如果仍然有问题,则可能必须更改 CLASSPATH 环境变量。要查看是否有必要,请try使用以下命令破坏 Classpath。
unset CLASSPATH
现在再次 Importingjava HelloWorldApp
。如果程序现在可以运行,则必须以与上述 PATH 变量相同的方式更改 CLASSPATH 变量。
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class
Starters 程序员经常犯的一个错误是try在由编译器创建的.class
文件上运行java
启动器。例如,如果try使用java HelloWorldApp.class
而不是java HelloWorldApp
运行程序,则会出现此错误。请记住,该参数是您要使用的类的名称,而不是文件名。
Exception in thread "main" java.lang.NoSuchMethodError: main
Java VM 要求您与其一起执行的类具有main
方法,从该处开始执行应用程序。 仔细看看“ Hello World!”应用详细讨论main
方法。
Applet 或 Java Web Start 应用程序被阻止
如果您正在通过浏览器运行应用程序,并收到表示该应用程序被阻止的安全警告,请检查以下各项:
-
验证是否已针对运行应用程序的环境正确设置了 JAR 文件清单中的属性。 Permissions 属性是必需的。在 NetBeans 项目中,可以通过展开项目文件夹并 Double 击
manifest\.mf
从 NetBeans IDE 的“文件”选项卡中打开清单文件。 -
验证应用程序是否由有效证书签名,并且该证书位于 Signer CA 密钥库中。
-
如果您正在运行本地 Servlets,请设置 Web 服务器以进行测试。您还可以将应用程序添加到 exception 站点列表,该列表在 Java 控制面板的“安全性”选项卡中进行 管理。