【问题标题】:When compiling a java program from cmd i get "error: cannot find symbol", but not in Eclipse从 cmd 编译 java 程序时,我得到“错误:找不到符号”,但在 Eclipse 中没有
【发布时间】:2016-07-23 17:53:08
【问题描述】:

我正在尝试制作一个计算器来对有理数进行算术运算。为此,我有一个Rational 课程。该程序应该从带有 args 的命令行执行:

java (...) num/denom 运算符(+-./) num/denom

创建Rational 类的实例时似乎出现编译错误,当我尝试从 cmd 编译时会发生这种情况。在 Eclipse 中编译时我没有收到此错误。带有计算器逻辑的main 方法目前有点混乱,所以我将粘贴一个来自测试类的示例,我在其中创建了一些 Rational 实例。我还将粘贴Rational 的代码。

测试方法如下:

public class TestRational {

    public static void main(String[] args) {

        Rational r1 = new Rational(1, 2);
        Rational r2 = new Rational(1, 2);
        Rational result = new Rational();

        result = r1.add(r2);

        System.out.println("r1 + r2 = " + result);

    }

}

Rational 类:

public class Rational extends Number implements Comparable<Rational> {

    private long numerator = 0;
    private long denominator = 1;

    private long[] r = new long[2];
    // numerator: r[0]
    // denominator: r[1]

    public Rational() {
        this(0, 1);
    }

    public Rational(long numerator, long denominator) {
        long gcd = gcd(numerator, denominator);
        this.r[0] = ((denominator > 0) ? 1 : -1) * numerator / gcd;
        this.r[1] = Math.abs(denominator) / gcd;
    }

    private static long gcd(long n, long d) {
        long n1 = Math.abs(n);
        long n2 = Math.abs(d);
        int gcd = 1;

        for (int k = 1; k <= n1 && k <= n2; k++) {
            if (n1 % k == 0 && n2 % k == 0)
                gcd = k;
        }
        return gcd;
    }

    public long getNumerator() {
        return r[0];
    }

    public long getDenominator() {
        return r[1];
    }

    public Rational add(Rational secondRational) {
        long n = r[0] * secondRational.getDenominator()
                + r[1] * secondRational.getNumerator();
        long d = r[1] * secondRational.getDenominator();
        return new Rational(n, d);
    }

    public Rational subtract(Rational secondRational) {
        long n = r[0] * secondRational.getDenominator()
                - r[1] * secondRational.getNumerator();
        long d = r[1] * secondRational.getDenominator();
        return new Rational(n, d);
    }

    public Rational multiply(Rational secondRational) {
        long n = r[0] * secondRational.getNumerator();      
        long d = r[1] * secondRational.getDenominator();
        return new Rational(n, d);
    }

    public Rational divide(Rational secondRational) {
        long n = r[0] * secondRational.getDenominator();    
        long d = r[1] * secondRational.getNumerator();
        return new Rational(n, d);
    }

    @Override
    public String toString() {
        if (r[1] == 1)
            return r[0] + "";
        else
            return r[0] + "/" + r[1];
    }

    @Override
    public boolean equals(Object other) {
        return (((this.subtract((Rational)(other))).getNumerator() == 0));
    }

    @Override
    public int intValue() {
        return (int)doubleValue();
    }

    @Override
    public float floatValue() {
        return (float)doubleValue();
    }

    @Override
    public double doubleValue() {
        return r[0] * 1.0 / r[1];
    }

    @Override 
    public long longValue() {
        return (long)doubleValue();
    }

    @Override
    public int compareTo(Rational o) {
        if (this.subtract(o).getNumerator() > 0)
            return 1;
        else if (this.subtract(o).getNumerator() < 0)
            return -1;
        else
            return 0;
    }

}

错误信息如下所示:

TestRational.java:7: error: cannot find symbol
Rational r1 = new Rational(1, 2)
^
symbol: class Rational
location: class TestRational

每次出现 Rational 单词时,我都会收到一条错误消息,其中“^”指向“R”。

我已阅读此帖子,但未能解决问题: link

任何人都可以看到导致错误的原因,为什么它只在为命令行编译程序时引起?

【问题讨论】:

  • 当我尝试从 cmd 编译时 -- 因为你必须一起编译所有的类。使用 Ant/Maven/Gradle 之类的构建工具确实有帮助。
  • @m0skit0:我在安装 JDE/JDK/Eclipse 时按照标准教程中的说明设置了类路径。
  • @cricket_007:在编译测试/主类之前编译 Rational 类是否简单?我仍然是初学者,所以我还没有深入研究您提到的任何构建工具。我只编译了主/测试类...
  • 这是一种可能性。或者你需要javac -cp &lt;some_path&gt;

标签: java eclipse command-line compiler-errors


【解决方案1】:

通常当编译器无法找到您在程序中使用的其他 java 文件时会出现此错误。

一个可能的原因是,您使用任何其他名称保存了您的文件,而不是 Rational.java。当找不到相同的类名时,编译器会给出这个错误。 解决方法:更改类名,重新编译。

第二次当你在你的类顶部使用 package 语句并编译你的类而不使用“-d”开关时。

解决方案:使用“javac -d E:\ TestRational.java Rational.java”编译你的java文件

“-d”的作用

链接:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
-d 目录 设置类文件的目标目录。该目录必须已经存在; javac 不会创建它。如果类是包的一部分,javac 会将类文件放在反映包名称的子目录中,并根据需要创建目录。例如,如果您指定 -d C:\myclasses 并且类称为 com.mypackage.MyClass,则类文件称为 C:\myclasses\com\mypackage\MyClass.class。 如果未指定 -d,javac 会将每个类文件与生成它的源文件放在同一目录中。

注意:-d 指定的目录不会自动添加到你的用户类路径中。

当我们使用没有'-d'开关的javac命令编译我们的java文件时,编译器会创建一个临时包编译你的类,将类文件保存在你的当前目录并删除包

你的情况会发生什么:

当您编译 TestRational.java 文件时,编译器会创建一个临时包并尝试在该包中找到 Rational.java,当编译器无法找到该类时,编译会显示此错误。

当您使用 eclipse IDE 时,eclipse 使用 ant/maven 等构建工具执行所有这些操作,因此您不会出现此类错误。

如果 Rational.java 位于不同的包中,则使用 -d 编译它,然后使用以下命令编译 TestRational.java javac -cp locationOfRationalClass -d locationOfNewPackage TestRational.java

【讨论】:

  • 我还有一些其他文件称为 Rational.java,但在其他包中。我与 testclass 一起使用的 Rational 类都在同一个包中。我认为testclass应该默认使用同一个包中的Rational类?
  • 据我了解,您的班级也有 package 声明。
  • 据我了解,您的班级也有 package 声明。我认为您正在使用没有开关的 javac 工具编译代码。当你的类有打包命令时,你必须使用“-d”开关来编译你的类。使用以下命令编译您的 java 文件“javac -d E:\ TestRational.java Rational.java”,或者您可以使用“javac -d E:\ *.java”
  • "javac -d E:\ TestRational.java Rational.java"。在此命令中 javac 是 java 编译器命令。 -d 是指定放置生成的类文件的位置的开关。 E:\ 是我要放置 .class 文件的位置。 TestRational.java,Rational.java 是我要编译的 java 类文件。要运行此文件,请到达位置“E:\”并使用 java mypackagename.TestRational
  • Rational 也在包中吗?
【解决方案2】:

我可以用命令提示符执行代码,请检查你的类名一次。 编译成功 /tmp/java_Rgjz2b/TestRational.java

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多