我正在尝试制作一个计算器来对有理数进行算术运算。为此,我有一个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