2012-05-03 4 views
1

donc j'ai une chose comme ceci:Java: Utilisation des variables de blocs try

try{ServerSocket acceptor = new ServerSocket(4782);} 
catch(IOException e){System.err.println("ERROR: Couldn't listen on port 4782!");} 
while (true) 
{ 
    Socket clientSock = acceptor.accept(); 


} 

Mais en essayant d'assigner clientSock, il dit qu'il ne peut pas trouver accepteur. Lorsque vous déplacez l'accepteur hors du bloc try, il explose avec une exception non gérée.

Devrais-je mettre quelque chose comme Socket clientSock; avant le bloc try?

Merci.

+0

(Je pense qu'il est génial que le langage Java soit spécifié pour attraper des bugs comme celui-ci, même s'ils sont généralement mal corrigés.) Je crois qu'Alex n'est pas d'accord avec moi.) –

Répondre

4

Une alternative à ce que les autres gens ici ont suggéré: vous pouvez déplacer plus de code dans le bloc try:

try{ 
    ServerSocket acceptor = new ServerSocket(4782); 

    while (true) { 
     Socket clientSock = acceptor.accept(); 
    } 
} catch(IOException e){ 
    System.err.println("ERROR: Network problem:" + e.getMessage()); 
} 

L'avantage de faire les choses de cette façon - quand vous pouvez vous en sortir avec c'est que le "chemin heureux" lit plus clairement; il est plus facile de suivre ce que le code est censé faire. Le côté obscur de cette approche est qu'elle conduit à regrouper différentes conditions d'erreur ensemble, de sorte que vous ne pouvez pas réagir de manière spécifique à des problèmes individuels. Parfois, cependant, même cela est un avantage plutôt qu'un problème.

+0

Si vous ne voulez pas ce 'catch 'particulier autour du' accept', vous pouvez lancer une exception à partir du 'catch' (une exception IOException' serait appropriée), juste return ou un try-catch imbriqué (peut vouloir séparer deux petites méthodes. –

1

Non, vous devez mettre le declarion de l'accepteur avant que le bloc d'essai, comme ceci:

ServerSocket acceptor = null; 
try { 
    acceptor = new ServerSocket(4782); 
} catch (IOException e) { 
    System.err.println("ERROR: Couldn't listen on port 4782!"); 
} 
while (true) { 
    Socket clientSock = acceptor.accept(); 
} 

Pour ce code, accepteur peut être nul dans la boucle while, soit vérifiez-il ou faire le flux de quelque chose -à l'intérieur du catch-block.

Vous pouvez également gérer le IOException que Socket clientSock = acceptor.accept(); pourrait lancer, car une telle exception casserait la boucle while - ce qui pourrait ne pas être conforme aux prévisions.

L'explication générale est que l'accepteur de déclarations variables «comme limitant que possible» des étendues java a été déclaré dans le try-block de votre code, donc non disponible/non déclaré en dehors de celui-ci.

+3

Vérifiez que 'acceptor' est nul avant d'entrer dans la boucle d'acceptation ... – climbage

+0

@climbage C'est une façon plutôt indirecte de le gérer. Il vaut mieux éviter complètement le 'null'. –

+0

@ TomHawtin-tackline indirect est mieux que pas du tout. Si j'étais motivé pour écrire moi-même une réponse, je le ferais différemment. – climbage

2

Vous pouvez conserver l'instanciation dans le try-catch mais sortir la déclaration de variable.

ServerSocket acceptor = null; 
try{acceptor = new ServerSocket(4782);} 
catch(IOException e){System.err.println("ERROR: Couldn't listen on port 4782!");} 
while (true) 
{ 
    Socket clientSock = acceptor.accept(); 


} 
+0

N'utilise pas de 'null' comme ça !! Que se passe-t-il si une 'IOException' est lancée? –

+0

@ TomHawtin-tackline Je respectais l'exemple original dans la question. Il est en effet très mauvais d'utiliser des null comme ça. Il est également mauvais d'attraper une exception IOException et de continuer à écouter après avoir été informé que la connexion est mauvaise. – Martin

+0

@ TomHawtin-tackline Pourquoi est-il vraiment mauvais d'utiliser des valeurs nulles comme ça? Y a-t-il une faille qui rend un comportement inattendu? –

Questions connexes