2016-07-23 4 views
0

Ich versuche, einen Rechner zu machen, um arithmetische Operationen auf rationalen Zahlen vorzufixieren. Dafür habe ich eine Rational Klasse. Das Programm sollte mit args von Kommandozeile ausgeführt werden:Beim Kompilieren eines Java-Programms von cmd bekomme ich "Fehler: kann Symbol nicht finden", aber nicht in Eclipse

java (...) num/denom Operator (+ - /.) Num/denom

Es ist wie ein einen Übersetzungsfehler zu bekommen scheint, wenn Instanzen der Schaffung Rational Klasse, und das passiert, wenn ich versuche, von cmd zu kompilieren. Ich bekomme diesen Fehler beim Kompilieren in Eclipse nicht. Die main Methode mit der Rechnerlogik ist im Moment ein wenig unordentlich, daher werde ich ein Beispiel aus einer Testklasse einfügen, wo ich einige Instanzen von Rational erstelle. Ich werde auch den Code für Rational einfügen.

Prüfverfahren unter:

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); 

    } 

} 

Die Rational Klasse:

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; 
    } 

} 

Die Fehlermeldung sieht wie folgt aus:

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

Ich erhalte eine Fehlermeldung für jedes Auftreten der Rationales Wort, mit einem "^" gegen das "R".

Ich habe diesen Beitrag gelesen haben, aber nicht in der Lage, das Problem zu lösen: link

Kann jemand sehen, was den Fehler verursacht, und warum ist es nur verursacht, wenn für die commandlinde das Programm zusammenzustellen?

+2

Sind specifing Sie die Classpath? http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html – m0skit0

+0

* wenn ich versuche, von cmd * zu kompilieren - Weil Sie alle Klassen zusammen kompilieren müssen. Ein Build Tool wie Ant/Maven/Gradle hilft dabei. –

+0

@ m0skit0: Ich habe den Klassenpfad wie in der Standardanleitung angegeben eingestellt, wenn ich JDE/JDK/Eclipse installiere. – Esben86

Antwort

1

Im Allgemeinen kommt dieser Fehler, wenn der Compiler nicht in der Lage ist, andere Java-Dateien zu finden, die Sie in Ihrem Programm verwenden.

Ein möglicher Grund dafür kann sein, dass Sie Ihre Datei mit einem anderen Namen anstelle von Rational.java gespeichert haben. Der Compiler gibt diesen Fehler, wenn derselbe Klassenname nicht gefunden wird. Lösung: Ändern Sie den Klassennamen und kompilieren Sie neu.

Zweitens, wenn Sie Paket-Anweisung an der Spitze Ihrer Klasse verwenden und Ihre Klasse ohne "-d" Switch kompilieren.

Lösung: Ihre Java-Datei kompilieren "javac -d E: \ TestRational.java Rational.java"

Was "-d" macht

-Link: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
-d Verzeichnis das Set Zielverzeichnis für Klassendateien. Das Verzeichnis muss bereits existieren. javac wird es nicht erstellen. Wenn eine Klasse Teil eines Pakets ist, fügt javac die Klassendatei in ein Unterverzeichnis ein, das den Paketnamen widerspiegelt, und erstellt Verzeichnisse nach Bedarf. Wenn Sie beispielsweise -d C: \ myclasses angeben und die Klasse com.mypackage.MyClass heißt, heißt die Klassendatei C: \ myclasses \ com \ mypackage \ MyClass.class. Wenn -d nicht angegeben ist, setzt javac jede Klassendatei in dasselbe Verzeichnis wie die Quelldatei, aus der sie generiert wurde.

Hinweis: Das mit -d angegebene Verzeichnis wird nicht automatisch zum Benutzerklassenpfad hinzugefügt.

Während wir unsere Java-Datei mit javac Befehl ohne ‚-d‘ Schalter kompilieren, Compiler ein temporäres Paket kompilieren Ihre Klasse erstellen, Klassendatei im aktuellen Verzeichnis speichern und löschen Sie das Paket

Was in Ihrem Fall geschehen:

Wenn Sie Ihre TestRational.java-Datei kompilieren, dann erstellen Sie ein temporäres Paket und versuchen, Rational.java in diesem Paket zu finden, und wenn der Compiler diese Klasse nicht finden kann, zeigt die Kompilierung diesen Fehler an.

Wenn Sie Eclipse IDE Eclipse verwenden all diese Dinge mit Build-Tool wie Ant/Maven, so dass Sie nicht diese Art von Fehler dort bekommen.

Wenn Rational.java in verschiedenen Paket ist dann kompilieren dies mit -d und dann TestRational.java Javac folgenden Befehl -cp locationOfRationalClass -d locationOfNewPackage TestRational.java

+0

Ich habe ein paar andere Dateien namens Rational.java, aber in anderen Paketen. Die Rational-Klasse, die ich mit der Testklasse verwende, sind beide im selben Paket. Ich glaube, dass die Testklasse die Rational-Klasse verwenden sollte, die standardmäßig im selben Paket ist. – Esben86

+0

Wie ich verstehe, dass Sie Klasse Paket Anweisung auch. –

+0

Wie ich verstehe, hat Ihre Klasse auch eine Paketanweisung. Ich denke, dass Sie Ihren Code mit javac-Tool ohne Schalter kompilieren. Während Ihre Klasse einen Befehl zum Erstellen von Paketen hat, müssen Sie einen '-d'-Schalter verwenden, um Ihre Klasse zu kompilieren. Kompilieren Sie Ihre Java-Datei mit dem folgenden Befehl "javac -d E: \ TestRational.java Rational.java" oder verwenden Sie "javac -d E: \ * .java" –

0

Ich kann den Code mit Befehl auszuführen Bitte überprüfen Sie Ihren Klassennamen einmal. erfolgreich kompiliert /tmp/java_Rgjz2b/TestRational.java < - Hauptmethode erfolgreich kompiliert /tmp/java_Rgjz2b/Rational.java O/p: r1 + r2 = 1

Verwandte Themen