【问题标题】:Java Will Not Compile Objects Created by MeJava 不会编译我创建的对象
【发布时间】:2011-02-09 23:11:05
【问题描述】:

我最近每次尝试编译创建我创建的类的实例的代码时都会收到此 Java 编译错误。我试过手动编译,从不同的位置编译,甚至尝试在安全模式下编译。我还在我的计算机上完全重新安装了 Java。这是我编写的代码示例以及我总是得到的错误:
Instance creator class:

public class Nothing {
    public static void main(String args[]) {
        Can World = new Can();
    }
}

实例化类:

public class Can {
    public Can() {
        System.out.println("Test");
    }
}

编译错误:

Nothing.java:4: cannot find symbol
symbol  : class Can
location: class Nothing
        Can World = new Can();
        ^
Nothing.java:4: cannot find symbol
symbol  : class Can
location: class Nothing
        Can World = new Can();
                        ^
2 errors

比我更了解 Java 的人尝试编译我遇到问题但没有成功的文件。此外,当我从 Eclipse(我的 IDE)中运行代码时,它会正常运行。

任何建议或解决方案都将非常非常感激。我真的很讨厌这样的事情阻止我编程。再次感谢。

编辑: 我曾经能够像这样编译类,直到最近我才开始收到这个错误。我正在使用我在 Eclipse IDE 中创建的外部工具进行编译,但我也尝试通过导航到 CMD 窗口中两个文件所在的目录并使用 javac Nothing.java 进行编译,但出现相同的错误。我也尝试过先编译 Can.java(编译),然后是 Nothing.java,但这也失败了。这是我从 CMD 窗口编译时得到的文本:

02/09/2011  06:44 PM    <DIR>          .
02/09/2011  06:44 PM    <DIR>          ..
02/09/2011  03:45 PM               289 .classpath
02/09/2011  03:45 PM               382 .project
02/09/2011  03:45 PM    <DIR>          .settings
02/09/2011  06:00 PM                75 Can.java
02/09/2011  05:49 PM               102 Nothing.java
               4 File(s)            848 bytes
               3 Dir(s)  64,669,216,768 bytes free

C:\Users\Alex\Mindstorms\NXT\leJOS NXJ\Moment>javac Nothing.java
Nothing.java:4: cannot find symbol
symbol  : class Can
location: class Nothing
                Can World = new Can();
                ^
Nothing.java:4: cannot find symbol
symbol  : class Can
location: class Nothing
                Can World = new Can();
                                ^
2 errors

【问题讨论】:

  • 两个类是否在同一个文件中?,我的意思是Can类在Nothing类中声明?如果不是,你必须导入它
  • @Chuck,两个公共类不能存在于同一个文件中(如果它们存在,他会因此得到一个错误),所以不能这样。
  • @Chuck Birkin:这两个课程都是公开的。如果它们在同一个文件中,它们将不会编译,但错误将是“class Can 是公共的,应该在名为 Can.java public class Can {”或类似的文件中声明。
  • 你是如何编译这些类的?如果您使用javac 来执行此操作,您能否提供您正在使用的确切命令?
  • 我认为值得检查您的源文件中是否没有不可打印的字符(正如 GreenMatt 在comment in his answer 中所建议的那样)

标签: java compilation compiler-errors


【解决方案1】:

问题是您需要有适当的导入语句(如果在单独的包中),并且需要从适当的目录运行 Java 编译器。假设您的目录结构如下所示:

src/
   com/
      yourdomain/
         example/
            Can.java
            Nothing.java

那么您需要在两个 *.java 文件的顶部添加以下内容:

package com.yourdomain.example;

并且你应该在Nothing.java中加入如下的import语句(技术上来说,当它们都在同一个包中时,这不是必须的,但在不同的包中是必须的,这是一个好习惯):

import com.yourdomain.example.Can;

然后您将从src 目录中调用编译器,如下所示:

 javac com/yourdomain/example/*.java

然后您可以使用以下命令运行此程序:

 java com.yourdomain.example.Nothing

顺便说一句,你真的不应该这样手动构建项目;您应该使用自动构建系统,例如 MavenAnt。如果您使用NetBeans IDE 创建项目,除了为您提供简单的“构建”、“运行”和“构建和运行”按钮以及各种不错的 IDE 功能(代码突出显示、增量编译和修复建议)之外,它会为你生成一个 Ant 构建项目。

编辑
根据您更新的问题,...请注意,Eclipse 的编译器与javac 不同。如果您使用 Cygwin 安装了 javac,或者您一直在 Windows 和 UNIX 之间共享文件(可能通过版本控制系统),您可能遇到了编码问题。我建议以 UTF-8 重新保存这些文件并运行 unix2dos(反之亦然,如果您通过 Cygwin 安装 javac)并重新编译。如果这不起作用,则可能值得重新安装 javac。做不到这一点,总会有 Ubuntu ;)。

【讨论】:

  • 包内的类不需要导入。
  • @Damian,Java 入门已经够令人困惑了……不值得添加。有 import 语句不会有什么坏处,如果他把它们放在单独的包中,那将是必要的。
【解决方案2】:

通过将您为每个类提供的代码放入单独的文件(当然,命名为 Can.java 和 Nothing.java)并将两个文件放在它们使用命令行编译器为我编译的同一目录中:

javac Nothing.java

该错误表示编译器在编译Nothing时找不到Can类。两个文件在同一个目录吗?

【讨论】:

  • 哇,没想到这么快就收到这么多回复,谢谢!这里有一些关于一切的更多细节:我曾经能够编译这样的类,直到最近我才开始收到这个错误。我正在使用我在 Eclipse IDE 中创建的外部工具进行编译,但我也尝试通过导航到 CMD 窗口中两个文件所在的目录并使用 javac Nothing.java 进行编译,但出现相同的错误。我也尝试过先编译 Can.java(编译),然后再编译 Nothing.java,但这也失败了。
  • @Alex Ozer:请编辑问题以将其他详细信息放入其中,以便第一次阅读该问题的人会在那里看到它们。不是每个人都会阅读 cmets 的答案。至于发生了什么,您是否有可能以某种方式在其中一个文件(可能是 Nothing.java)中获得了不可打印的字符?尝试重新输入内容(我知道这很痛苦)并重新编译。我将从Can World = new Can(); 行开始。
【解决方案3】:

我想通了。事实证明,我曾尝试在我的计算机上使用 Java 设置旧版本的乐高机器人,并且我已经创建了一些环境变量来配合它。其中之一是 CLASSPATH 变量。我非常有信心 Java 正在尝试读取该变量(我不再使用该变量)来查找我的类。一旦我删除它(以及我没有使用的其他旧变量),重新启动我的计算机并重新安装 JDK,一切正常。

感谢大家的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多