# 课程：常见问题（及其解决方案）

> 原文： [https://docs.oracle.com/javase/tutorial/getStarted/problems/index.html](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 变量](https://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html#BABGDJFH)部分。

`**类名称'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&gt;`。如果在提示符下输入`dir`，则应该看到`.java`和`.class`文件。现在再次输入`java HelloWorldApp`。

如果仍有问题，则可能必须更改 CLASSPATH 变量。要查看是否有必要，请尝试使用以下命令对类路径进行破坏。

```
set CLASSPATH=

```

现在再次输入`java HelloWorldApp`。如果程序现在可以运行，则必须更改 CLASSPATH 变量。要设置此变量，请参阅 JDK 8 安装说明中的[更新 PATH 变量](https://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html#BABGDJFH)部分。 CLASSPATH 变量以相同的方式设置。

`**无法找到或加载主类 HelloWorldApp.class**`

初学者程序员常犯的一个错误就是尝试在编译器创建的`.class`文件上运行`java`启动程序。例如，如果您尝试使用`java HelloWorldApp.class`而不是`java HelloWorldApp`运行程序，则会出现此错误。请记住，参数是您要使用的类的 _ 名称，_ 而不是 _ 文件名。_

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

Java VM 要求您使用它执行的类具有`main`方法，以便开始执行您的应用程序。 [仔细看看“Hello World！”应用程序](../application/index.html)详细讨论了`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！”应用程序](../application/index.html)详细讨论了`main`方法。

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

如果您通过浏览器运行应用程序并获得说明应用程序被阻止的安全警告，请检查以下各项：

*   验证是否为运行应用程序的环境正确设置了 JAR 文件清单中的属性。 Permissions 属性是必需的。在 NetBeans 项目中，您可以通过展开项目文件夹并双击 `manifest.mf` ，从 NetBeans IDE 的“文件”选项卡中打开清单文件。

*   验证应用程序是否由有效证书签名，并且证书位于签名者 CA 密钥库中。

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