¿Por qué aparece el "tipo de excepción no controlada IOException"?
Tengo el siguiente código simple:
import java.io.*;
class IO {
public static void main(String[] args) {
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
System.out.println(userInput);
}
}
}
Y recibo el siguiente mensaje de error:
----------
1. ERROR in io.java (at line 10)
while ((userInput = stdIn.readLine()) != null) {
^^^^^^^^^^^^^^^^
Unhandled exception type IOException
----------
1 problem (1 error)roman@roman-laptop:~/work/java$ mcedit io.java
¿Alguien tiene alguna idea de por qué? Intenté simplificar el código proporcionado en el sitio web de suma ( aquí ). ¿Simplifiqué demasiado?
Debes agregar "lanza IOException" a tu método principal:
public static void main(String[] args) throws IOException {
Puede leer un poco más sobre las excepciones marcadas (que son específicas de Java) en JLS .
Java tiene una característica llamada "excepciones marcadas". Eso significa que hay ciertos tipos de excepciones, concretamente aquellas que subclasifican Exception pero no RuntimeException, de modo que si un método puede generarlas, debe enumerarlas en su declaración de lanzamientos, por ejemplo: void readData() lanza IOException. IOException es uno de esos.
Por lo tanto, cuando llama a un método que enumera IOException en su declaración de lanzamientos, debe incluirlo en su propia declaración de lanzamientos o capturarlo.
La razón de la presencia de excepciones marcadas es que para algunos tipos de excepciones, no se debe ignorar el hecho de que pueden ocurrir, porque su ocurrencia es una situación bastante regular, no un error del programa. Por lo tanto, el compilador le ayuda a no olvidarse de la posibilidad de que se genere dicha excepción y requiere que la maneje de alguna manera.
Sin embargo, no todas las clases de excepción marcadas en la biblioteca estándar de Java se ajustan a este razonamiento, pero ese es un tema totalmente diferente.
Inténtalo de nuevo con este fragmento de código:
import java.io.*;
class IO {
public static void main(String[] args) {
try {
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
System.out.println(userInput);
}
} catch(IOException ie) {
ie.printStackTrace();
}
}
}
Usar try-catch-finally
es mejor que usar throws
. Encontrar errores y depurar es más fácil cuando usas try-catch-finally
.