Estoy tratando de hacer una calculadora para realizar operaciones aritméticas con números racionales. Para esto tengo una Rational
clase. El programa debe ejecutarse desde la línea de comandos con argumentos:
java (...) operador num / denom (+ -. /) num / denom
Parece que se obtiene un error de compilación al crear instancias de la Rational
clase, y esto sucede cuando intento compilar desde cmd. No obtengo este error al compilar en Eclipse. El main
método con la lógica de la calculadora es un poco complicado en este momento, así que pegaré un ejemplo de una clase de prueba donde estoy creando algunas instancias de Rational. También pegaré el código para Rational
.
Método de prueba a continuación:
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);
}
}
La Rational
clase:
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;
}
}
El mensaje de error tiene este aspecto:
TestRational.java:7: error: cannot find symbol
Rational r1 = new Rational(1, 2)
^
symbol: class Rational
location: class TestRational
Recibo un mensaje de error por cada aparición de la palabra racional, con un "^" apuntando hacia la "R".
He leído esta publicación, pero no he podido resolver el problema: enlace
¿Alguien puede ver qué está causando el error y por qué solo se produce al compilar el programa para la línea de comandos?
Generalmente, este error se produce cuando el compilador no puede encontrar otro archivo java que esté utilizando en su programa.
Una posible razón puede ser la siguiente: ha guardado su archivo con cualquier otro nombre en lugar de Rational.java. El compilador dará este error cuando no se encuentre el mismo nombre de clase. Solución: cambie el nombre de la clase y vuelva a compilar.
En segundo lugar, cuando usa la declaración del paquete en la parte superior de su clase y cumple su clase sin el interruptor "-d".
Solución: compile su archivo java usando "javac -d E: \ TestRational.java Rational.java"
¿Qué hace "-d"
Enlace: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
-d directorio Establece el directorio de destino para los archivos de clase. El directorio ya debe existir; javac no lo creará. Si una clase es parte de un paquete, javac coloca el archivo de clase en un subdirectorio que refleja el nombre del paquete, creando directorios según sea necesario. Por ejemplo, si especifica -d C: \ myclasses y la clase se llama com.mypackage.MyClass, entonces el archivo de clase se llama C: \ myclasses \ com \ mypackage \ MyClass.class. Si no se especifica -d, javac coloca cada archivo de clase en el mismo directorio que el archivo fuente desde el que se generó.
Nota: El directorio especificado por -d no se agrega automáticamente a su ruta de clase de usuario.
Mientras compilamos nuestro archivo java usando el comando javac sin el modificador '-d', el compilador crea un paquete temporal, compila su clase, guarda el archivo de clase en su directorio actual y elimina el paquete
Que pasa en tu caso:
Cuando compila su archivo TestRational.java, el compilador crea un paquete temporal e intenta encontrar Rational.java en ese paquete y cuando el compilador no puede encontrar esa clase, la compilación muestra este error.
cuando usa eclipse IDE, eclipse tome todas estas cosas usando una herramienta de compilación como ant / maven, para que no obtenga este tipo de error allí.
Si Rational.java está en un paquete diferente, compílelo usando -d y luego TestRational.java usando el siguiente comando javac -cp locationOfRationalClass -d locationOfNewPackage TestRational.java
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras