常见问题(及其解决方案)

Last updated: ... / Reads: 429 Edit

原文链接:https://docs.oracle.com/javase/tutorial/getStarted/problems/index.html

编译器问题

Microsoft Windows 系统上常见的错误消息

“javac” 不是内部或外部命令,也不是可运行的程序或批处理文件

如果你收到这个错误,表示 Windows 找不到编译器(javac)。

以下是一种告诉 Windows 如何找到 javac 的方法。假设你将 JDK 安装在 C:\jdk1.8.0 目录下。你需要在命令提示符下输入以下命令并按回车键:

C:\jdk1.8.0\bin\javac HelloWorldApp.java

如果你选择这个选项,每次编译或运行程序时,都需要在 javac 和 java 命令之前加上 C:\jdk1.8.0\bin\。为了避免这种额外的输入,可以参考 JDK 8 安装说明中的“更新 PATH 变量”一节。

类名“HelloWorldApp”只有在显式请求注解处理时才被接受

如果你收到这个错误,说明在编译程序时忘记了包含 .java 后缀。请记住,命令是 javac HelloWorldApp.java,而不是 javac HelloWorldApp。

UNIX 系统上常见的错误消息

javac: 找不到命令

如果你收到这个错误,表示 UNIX 找不到编译器 javac。

以下是一种告诉 UNIX 如何找到 javac 的方法。假设你将 JDK 安装在 /usr/local/jdk1.8.0 目录下。你需要在命令提示符下输入以下命令并按回车键:

/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:8: error: ';' expected
count++
^
1 error

如果你看到任何编译器错误,说明你的程序没有成功编译,编译器也没有创建 .class 文件。请

仔细检查程序,修复任何发现的错误,然后重试。

语义错误

除了验证程序在语法上是否正确之外,编译器还检查其他基本的正确性。例如,每次使用未初始化的变量时,编译器都会发出警告:

Testing.java:8: error: variable count might not have been initialized
count++;
^
Testing.java:9: error: variable count might 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 目录下,你需要将当前目录更改为该目录。要更改目录,请在命令提示符下输入以下命令并按回车键:

cd c:\java

命令提示符应该变为 C:\java>。如果你在提示符下输入 dir 命令,应该可以看到你的 .java 和 .class 文件。现在再次输入 java HelloWorldApp。

如果问题仍然存在,你可能需要更改 CLASSPATH 变量。要查看是否需要更改 CLASSPATH,可以使用以下命令重置 classpath。

set CLASSPATH=

然后再次输入 java HelloWorldApp。如果程序现在正常运行,你需要更改 CLASSPATH 变量。要设置此变量,请参考 JDK 8 安装说明中的“更新 PATH 变量”一节。CLASSPATH 变量的设置方式与 PATH 变量相同。

Could not find or load main class HelloWorldApp.class

初学者常犯的一个错误是尝试在由编译器创建的 .class 文件上运行 java 启动器。例如,如果你尝试使用 java HelloWorldApp.class 而不是 java HelloWorldApp 来运行程序,就会收到这个错误。请记住,参数应该是你要使用的类的名称,而不是文件名。

Exception in thread "main" java.lang.NoSuchMethodError: main

Java 虚拟机要求你要执行的类具有一个 main 方法,作为应用程序开始执行的入口点。在《深入了解“Hello World!”应用程序》中详细讨论了 main 方法。

UNIX 系统上的错误消息

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp

如果你收到这个错误,表示 Java 找不到你的字节码文件 HelloWorldApp.class。

Java 会尝试在当前目录中找到你的字节码文件。所以,例如,如果你的字节码文件位于 /home/jdoe/java 目录下,你需要将当前目录更改为该目录。要更改目录,请在命令提示符下输入以下命令并按回车键:

cd /home/jdoe/java

如果你在提示符下输入 pwd 命令,应该可以看到 /home/jdoe/java。如果你在提示符下输入 ls 命令,应该可以看到你的 .java 和 .class 文件。现在再次输入 java HelloWorldApp。

如果问题仍然存在,你可能需要更改 CLASSPATH 环境变量。要查看是否需要更改 CLASSPATH,请使用以下命令清除 classpath。

unset CLASSPATH

然后再次输入 java HelloWorldApp。如果程序现在正常运行,你需要以与上述 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 虚拟机要求你要执行的类具有一个 main 方法,作为应用程序开始执行的入口点。在《深入了解“Hello World!”应用程序》中详细讨论了 main 方法。

Applet 或 Java Web Start 应用程序被阻止

如果你通过浏览器运行应用程序并收到安全警告,提示应用程序被阻止,请检查以下事项:

  • 验证 JAR 文件清单中的属性是否针对应用程序运行的环境正确设置。必须设置 Permissions 属性。在 NetBeans 项目中,你可以通过展开项目文件夹并双击 manifest.mf 在 NetBeans IDE 的文件选项卡中打开清单文件。

  • 确保应用程序已使用有效证书进行签名,并且证书位于签名 CA 密钥库中。

  • 如果你正在运行本地 applet,请设置用于测试的 Web 服务器。你还可以将应用程序添加到例外站点列表中,该列表在 Java 控制面板的安全选项卡中进行管理。


Comments

Make a comment