2010-03-23 9 views
5

je les 3 lignes du code ci-dessous:Que faire si une exception IOException est lancée?

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

Le compilateur se plaint de toutes ces 3 lignes et son plaignent est la même pour les 3 lignes: exception non déclarée java.io.IOException; En plus de détails, ces exceptions sont levées par new ServerSocket, accept() et getInputStream().

Je sais que je dois utiliser try ... catch .... Mais pour cela, j'ai besoin de savoir ce que signifient ces exceptions dans chaque cas particulier (comment les interpréter). Quand ils arrivent? Je veux dire, pas en général, mais dans ces 3 cas particuliers.

Répondre

5

Vous ne savez pas EN PARTICULIER parce que l'exception E/S est également une exception "générique" qui peut avoir plusieurs causes techniques. Cela signifie qu'un problème inattendu est survenu au niveau de l'entrée/sortie, mais il est évident qu'il a des causes différentes sur le disque dur local que sur Internet.

En général, les trois éléments se résolvent autour des sockets. Les causes sont donc liées aux problèmes de réseau. Les possibles sont:

  • Aucun réseau du tout, pas même localhost (ce serait un problème technique sérieux).
  • Port déjà utilisé, lorsqu'un numéro de port est indiqué (nouveau port de serveur (earPort))
  • Problèmes de réseau - par exemple, quelqu'un a trébuché sur le câble lors de certaines opérations. Peut également être une cause de mauvaise qualité, une attaque DDOS, etc.
  • Épuisement de port - aucun port côté client disponible pour une nouvelle connexion.

Fondamentalement autour de cette ligne.

La même chose se produira ou pourra se produire chaque fois que vous faites quelque chose avec les flux.

Dans thi Scase vous AHVE deux principales causes possibles:

  • Première ligne: la prise est déjà en cours d'utilisation (programme démarré il y a 2 fois, même port que d'autres programmes). Ceci est évidemment non-réparable normalement à moins que l'utilisateur ne fasse quelque chose.
  • Erreur générique d'exécution ultérieure. Cela peut arriver pendant les opérations normales.
+0

+1 Ceci est le coeur de la réponse. Pensez à ce qui peut mal tourner. L'API vous dit que cela ne fonctionnera pas toujours pour des raisons indépendantes de votre volonté. Comment voulez-vous gérer cette condition d'erreur? Une fois que vous connaissez la réponse à cette question, vous saurez ce que vous voulez faire pour satisfaire le compilateur. – Yishai

1

La façon la plus simple est de déclarer votre méthode d'appel pour lancer IOException, mais vous devez les ressources allouées de nettoyage dans finally clauses avant de quitter votre méthode:

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 général, il n'a pas d'importance exactement ce qui a causé l'exception IOException initiale, car votre application ne peut pas faire grand-chose pour corriger la situation.

Cependant, comme réponse générale à votre question de "quoi faire" vous avez quelques options.

  • Try Again - travail mai si le problème était intermittent. N'oubliez pas de fournir une condition de rupture au cas où ce n'est pas le cas.
  • Essayez quelque chose d'autre - Chargez la ressource à partir d'un emplacement différent ou via une méthode différente.
  • Abandonner - Lancer/relancer l'exception et/ou annuler l'action ou peut-être le programme entier. Vous voudrez peut-être fournir un message convivial à ce stade ... ;-) Si votre programme nécessite l'entrée pour fonctionner alors ne pas avoir l'entrée laisse peu de choix mais pour ne pas fonctionner.
Questions connexes