【发布时间】: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 <some_path>
标签: java eclipse command-line compiler-errors