从cmd编译Java程序时,我得到"error: cannot find symbol",但不是在Eclipse中



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

java(…)num/deom运算符(+-./)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"。

我读过这篇文章,但一直未能解决问题:链路

有人能看到是什么导致了错误吗?为什么只有在为commandlinde编译程序时才会导致错误?

通常,当编译器无法找到您在程序中使用的其他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.jar,当编译器找不到该类时,compile会显示此错误。

当您使用eclipseIDE时,eclipse使用ant/maven等构建工具来完成所有这些工作,因此不会出现这种错误。

如果Rational.java在不同的包中,那么使用-d编译它,然后使用以下命令测试Rational.jarjavac-cp locationOfRationalClass-d locationOfNewPackage TestRational.java

我可以在命令提示符下执行代码,请检查您的类名一次。成功编译/tmp/java_Rgjz2b/TestRational.java<--主要方法成功编译/tmp/java_Rgjz2b/Rational.javaO/p:r1+r2=1

最新更新