Excepción no controlada en Java
exception unhandled (2)
Actualmente estoy en el proceso de aprender a hacer una excepción personalizada y me encontré con un problema. Cada vez que intento utilizar un objeto de una clase que arroja esta excepción personalizada, el depurador de mi IDE (estoy usando la idea IntelliJ) dice "Excepción no controlada: InsertExceptionName ()". El código, de manera simplificada, se parece a esto. En este caso, debería devolver una excepción si el número generado aleatoriamente es <0.5, y devolver un número de lo contrario, pero no lo hará. ¿Qué me estoy perdiendo?
public class main {
public static void main(String[] args) {
double x=Math.random();
operation op=new operation();
op.execute(x);
}
}
-
public class operation {
public operation() {
}
public double execute(double x) throws RandomWeirdException {
if(x<0.5) {
throw new RandomWeirdException("<0.5");
}
return x;
}
}
-
public class RandomWeirdException extends Exception{
public RandomWeirdException() {
super();
}
public RandomWeirdException(String message) {
super(message);
}
}
¿Qué quiere decir "devolver" una excepción? Cuando se produce una excepción, burbujea la pila de llamadas.
No lo está manejando en este caso.
Llega a
main
y, por lo tanto, tiene una excepción no controlada.
Si desea manejar una excepción, usaría un bloque
try-catch
.
Preferiblemente alrededor de la tubería
main
en este caso.
try {
// Code that might throw
// an exception.
} catch (Exception e) {
// Handle it.
}
Otra solución sería especificar que
main
lanza una "
RandomWeirdException
", y no
catch
en primer lugar.
public static void main(String[] args) throws RandomWeirdException { ... }
Es preferible simplemente dejar que se
throw
funciones, a menos que pueda manejar razonablemente el caso excepcional.
Si solo
catch
por capturar sin hacer nada significativo en un caso excepcional, es el equivalente de ocultar un error a veces.
Está utilizando el método de
execute
, sin crear un bloque try-catch para
RandomWiredException
que declara que está lanzando.
Java requirió que todas las excepciones marcadas (que extienden la
Exception
) sean manejadas adecuadamente por la persona que llama, ya sea con un bloque try-catch o agregando
throws
al método de llamada (en este caso, es
main
, sin embargo, no debería tener una cláusula de
throws
).
Entonces, la forma correcta de hacerlo es como:
public class Main {
public static void main(String[] args) {
double x=Math.random();
operation op=new operation();
try {
op.execute(x);
} catch ( RandomWiredException e ) {
e.printStackTrace();
System.exit(1);
}
}
}
El código real en la cláusula catch depende de los requisitos de su aplicación, por supuesto.
Nota: use mayúscula inicial cuando nombre las clases. Esta es una de las convenciones de estilo de Java que mejorará la legibilidad de su código.