2010-03-23 15 views
5

tengo los siguientes 3 líneas de código:¿Qué debo hacer si se lanza una IOException?

ServerSocket listeningSocket = new ServerSocket(earPort); 
Socket serverSideSocket = listeningSocket.accept(); 
BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 

El compilador se queja de todas estas líneas 3 y su queja es la misma para todas las 3 líneas: no declarada java.io.IOException excepción; En más detalles, estas excepciones son lanzadas por new ServerSocket, accept() y getInputStream().

Sé que necesito usar try ... catch .... Pero para eso necesito saber qué significan estas excepciones en cada caso particular (cómo debería interpretarlas). Cuando suceden? Quiero decir, no en general, sino en estos 3 casos particulares.

Respuesta

5

No se conoce EN PARTICULAR porque IO Exception también es una excepción "genérica" ​​que puede tener muchas causas desde el punto de vista técnico. Significa que se produjo un problema inesperado con respecto a la entrada/salida, pero obviamente tiene diferentes causas en el disco duro local que en Internet.

En general, los tres elementos se resuelven alrededor de los zócalos. Entonces, las causas están relacionadas con problemas de red. Posibles son:

  • Sin red, ni siquiera localhost (sería un problema técnico grave).
  • puerto ya está en uso, cuando se le da un número de puerto (nuevo Socket Server (earPort))
  • problemas de red - por ejemplo somseone tropezó con el cable durante algunas cosas. También puede ser una causa de mala calidad, un ataque DDOS, etc.
  • Agotamiento del puerto: no hay un puerto del lado del cliente disponible para una nueva conexión.

Básicamente alrededor de esta línea.

Lo mismo sucederá o podrá suceder cada vez que haga algo con las transmisiones.

En Thi scase te tomarse dos posibles causas principales:

  • primera línea: el socket ya está en uso (programa iniciado hace 2 veces, mismo puerto que otro programa). Obviamente, esto no se puede arreglar normalmente a menos que el usuario haga algo.
  • Error genérico de tiempo de ejecución posterior. Esto puede suceder durante las operaciones normales.
+0

+1 Este es el núcleo de la respuesta. Piensa en lo que puede salir mal. La API le dice que no siempre funcionará por razones que escapan a su control. ¿Cómo quieres manejar esa condición de error? Una vez que sepa la respuesta a esa pregunta, sabrá lo que quiere hacer para satisfacer al compilador. – Yishai

1

La forma más sencilla es declarar su método de llamada a tirar IOException, pero lo que necesita recursos asignados limpieza en finally cláusulas antes de salir de su método:

public void doSession () throws IOException 
{ 
    final ServerSocket listeningSocket = new ServerSocket(earPort); 

    try 
    { 
    final Socket serverSideSocket = listeningSocket.accept(); 

    try 
    { 
     final BufferedReader in = 
     new BufferedReader(
      new InputStreamReader(
      serverSideSocket.getInputStream() 
     ) 
     ); 
    } 
    finally 
    { 
     serverSideSocket.close() 
    } 
    } 
    finally 
    { 
    listeningSocket.close() 
    } 
} 
1

En general no importa exactamente qué causó la IOException inicial porque hay poco que su aplicación puede hacer para corregir la situación.

Sin embargo, como respuesta general a su pregunta de "qué hacer", tiene algunas opciones.

  • intentarlo de nuevo-mayo trabajo si el problema era intermitente. Recuerde proporcionar una condición de descanso en caso de que no lo haga.
  • Pruebe algo diferente - Cargue el recurso desde una ubicación diferente o mediante un método diferente.
  • Give Up - Tire/vuelva a lanzar la excepción y/o anule la acción o quizás todo el programa. Es posible que desee proporcionar un mensaje fácil de usar en este punto ... ;-) Si su programa requiere, la entrada para que funcione y luego no tenga la entrada no le deja otra opción más que para no funcionar.
Cuestiones relacionadas