课程:常见问题(及其解决方案)
原文: https://docs.oracle.com/javase/tutorial/getStarted/problems/index.html
Microsoft Windows 系统上的常见错误消息
**'javac'未被识别为内部或外部命令,可操作程序或批处理文件**
如果收到此错误,Windows 无法找到编译器(javac
)。
这是告诉 Windows 在哪里找到javac
的一种方法。假设您在C:\jdk1.8.0
中安装了 JDK。在提示符下,您将键入以下命令并按 Enter 键:
C:\jdk1.8.0\bin\javac HelloWorldApp.java
如果选择此选项,则每次编译或运行程序时,必须在C:\jdk1.8.0\bin\
和C:\jdk1.8.0\bin\
命令之前添加C:\jdk1.8.0\bin\
。要避免这种额外输入,请参阅 JDK 8 安装说明中的更新 PATH 变量部分。
**类名称'HelloWorldApp'仅在明确请求注释处理时才被接受**
如果收到此错误,则在编译程序时忘记包含.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/
。要避免这种额外的输入,可以将此信息添加到 PATH 变量中。执行此操作的步骤将根据您当前运行的 shell 而有所不同。
**类名称'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 变量。要查看是否有必要,请尝试使用以下命令对类路径进行破坏。
set CLASSPATH=
现在再次输入java HelloWorldApp
。如果程序现在可以运行,则必须更改 CLASSPATH 变量。要设置此变量,请参阅 JDK 8 安装说明中的更新 PATH 变量部分。 CLASSPATH 变量以相同的方式设置。
**无法找到或加载主类 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 环境变量。要查看是否有必要,请尝试使用以下命令对类路径进行破坏。
unset CLASSPATH
现在再次输入java HelloWorldApp
。如果程序现在可以运行,则必须以与上面的 PATH 变量相同的方式更改 CLASSPATH 变量。
**线程“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
方法。
Applet 或 Java Web Start 应用程序被阻止
如果您通过浏览器运行应用程序并获得说明应用程序被阻止的安全警告,请检查以下各项:
验证是否为运行应用程序的环境正确设置了 JAR 文件清单中的属性。 Permissions 属性是必需的。在 NetBeans 项目中,您可以通过展开项目文件夹并双击
manifest.mf
,从 NetBeans IDE 的“文件”选项卡中打开清单文件。验证应用程序是否由有效证书签名,并且证书位于签名者 CA 密钥库中。
如果您正在运行本地小程序,请设置用于测试的 Web 服务器。您还可以将应用程序添加到例外站点列表中,该列表在 Java 控制面板的“安全”选项卡中进行管理。