2016-07-23 6 views
0

有理数の算術演算を実行する計算機を作ろうとしています。このため私はRationalクラスを持っています。プログラムでは、引数をコマンドラインから実行する必要があります:cmdからJavaプログラムをコンパイルすると、 "エラー:シンボルを見つけることができません"というメッセージが表示されます。

の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 

私はそれぞれの出現に対して1つのエラーメッセージが表示されます合理的な単語で、 "^"は "R"を指す。

私はこの記事を読んだことがあるが、問題を解決することができていない: link

誰がエラーを引き起こしているかを見ることができ、かつcommandlinde用のプログラムをコンパイルするときに、なぜそれが唯一の原因は?

+2

あなたはクラスパスをspecifingていますか? http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html – m0skit0

+0

* cmdからコンパイルしようとすると* - すべてのクラスを一緒にコンパイルする必要があるためです。 Ant/Maven/Gradleのようなビルドツールを使用すると、実際にそのように役立ちます。 –

+0

@ m0skit0:JDE/JDK/Eclipseをインストールする際に標準チュートリアルの指示に従ってクラスパスを設定しました。 – Esben86

答えて

1

一般的にこのエラーは、コンパイラがあなたのプログラムで使用している他のJavaファイルを見つけることができない場合に発生します。

考えられる理由としては、Rational.javaの代わりに別の名前でファイルを保存したことが考えられます。同じクラス名が見つからない場合、コンパイラはこのエラーを返します。 解決方法:クラス名を変更して再コンパイルしてください。

2番目に、クラスの先頭でpackage文を使用し、 "-d"スイッチを使用せずにクラスをコンパイルするとき。

策:使用してJavaファイルをコンパイル "のjavacに-d Eを:\ TestRational.java Rational.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は異なるパッケージ内にある場合

することは、私はコマンドを使用してコードを実行することができる午前、次のコマンドを のjavac -cp locationOfRationalClass -d locationOfNewPackage TestRational.java

+0

私はRational.javaというファイルをいくつか持っていますが、他のパッケージにはあります。私がテストクラスで使用しているRationalクラスは、両方とも同じパッケージに入っています。私は、テストクラスはデフォルトで同じパッケージにあるRationalクラスを使用すべきだと思いますか? – Esben86

+0

私はクラスにpackageステートメントもあることを理解しています。 –

+0

あなたのクラスにはpackageステートメントもあります。私はスイッチなしでjavacツールを使用してコードをコンパイルしていると思います。クラスにはパッケージ作成コマンドがありますが、クラスをコンパイルするには '-d'スイッチを使用する必要があります。 "javac -d E:\ TestRational.java Rational.java"コマンドを使用するか、 "javac -d E:\ * .java"を使用してJavaファイルをコンパイルしてください。 –

0

を使用して、この使用して、その後-dとTestRational.javaをコンパイルプロンプトが表示されたら、クラス名を一度確認してください。 が正常/tmp/java_Rgjz2b/TestRational.java <をコンパイル - mainメソッドは成功しましたO/P /tmp/java_Rgjz2b/Rational.java をコンパイル : R1 + R2 = 1

関連する問題