2010-02-21 20 views
26

tengo el siguiente código simple:¿Por qué obtengo la "Excepción no controlada tipo IOException"?

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 me sale 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)[email protected]:~/work/java$ mcedit io.java 

¿Alguien tiene alguna idea de por qué? Solo traté de simplificar el código proporcionado en el sitio web de suma (here). ¿Simplifiqué demasiado?

Respuesta

38

Debe añadir "throws IOException" a su principal método:

public static void main(String[] args) throws IOException {

se puede leer un poco más acerca de las excepciones controladas (que son específicos de Java) en JLS.

36

Java tiene una función llamada "excepciones comprobadas". Eso significa que hay ciertos tipos de excepciones, a saber, aquellas que subclase Exception pero no RuntimeException, de modo que si un método puede arrojarlas, debe enumerarlas en su declaración throws, por ejemplo: void readData() arroja 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 listarlo en su propia declaración de lanzamientos o atraparlo.

La razón de la presencia de excepciones comprobadas es que, para algunos tipos de excepciones, no 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 olvidar la posibilidad de que se genere una excepción de este tipo y requiere que la maneje de alguna manera.

Sin embargo, no todas las clases de excepción comprobadas en la biblioteca estándar de Java se ajustan a esta lógica, pero ese es un tema totalmente diferente.

9

intente 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(); 
     } 
    } 
} 

Usando try-catch-finally es mejor que usar throws. Encontrar errores y depuración es más fácil cuando usa try-catch-finally.

0

Leer la entrada desde el teclado es similar a descargar archivos de Internet, el sistema java abre conexiones con la fuente de datos para leer con InputStream o Reader, debe manejar una situación donde la conexión puede romperse utilizando IOExceptions

Si usted quiere saber exactamente lo que significa trabajar con InputStreams y BufferedReader this video lo muestra

0

complemento "throws IOException" a su método como este:

public static void main(String args[]) throws IOException{ 

     FileReader reader=new FileReader("db.properties"); 

     Properties p=new Properties(); 
     p.load(reader); 


    } 
Cuestiones relacionadas