2010-04-23 4 views
1

Cette question concerne les exceptions java, pourquoi y a-t-il des cas où une exception est levée alors que l'exception est interceptée et qu'il n'y a pas d'instruction exit()? mon code ressemble à cecigestion de l'exception java

void bindProxySocket(DefaultHttpClientConnection proxyConnection, String hostName, HttpParams params) 
{ 
    if (!proxyConnection.isOpen()) 
    { 

     Socket socket = null; 
     try { 
      socket = new Socket(hostName, 80); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try 
     { 
      proxyConnection.bind(socket, params); 
     } 
     catch(IOException e) 
     { 
      System.err.println ("couldn't bind socket"); 
      e.printStackTrace(); 
     } 
    } 
} 

puis

J'appelle cette méthode comme ceci:

bindProxySocket(proxyConn, hostName, params1); 

mais, les sorties du programme, bien que je veux gérer l'exception en faisant quelque chose Sinon, est-ce parce que je n'ai pas inclus l'appel de méthode dans une clause try catch? que se passe-t-il si j'attrape à nouveau l'exception même si c'est déjà dans la méthode? et que dois-je faire si je veux nettoyer les ressources dans la clause finale seulement si une exception se produit et sinon je veux continuer avec le programme? Je devine dans ce cas que je dois inclure la totalité du code jusqu'à ce que je puisse nettoyer les ressources avec une instruction try ou puis-je le faire dans l'instruction handle exception? certaines de ces questions sont sur ce cas particulier, mais je voudrais obtenir une réponse approfondie à toutes mes questions pour référence future. grâce

modifier:

java.net.UnknownHostException: www.dsewew324f.com 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at homework3.Proxy.bindProxySocket(Proxy.java:666) 
    at homework3.Proxy$3.handle(Proxy.java:220) 
    at org.apache.http.protocol.HttpService.doService(HttpService.java:293) 
    at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:212) 
    at homework3.Proxy.start(Proxy.java:472) 
    at homework3.Proxy.main(Proxy.java:1282) 
Exception in thread "main" java.lang.IllegalArgumentException: Socket may not be null 
    at org.apache.http.impl.DefaultHttpClientConnection.bind(DefaultHttpClientConnection.java:80) 
    at homework3.Proxy.bindProxySocket(Proxy.java:674) 
+1

Donner la pile de l'exception serait utile. – Bozho

+0

Noona, vous avez reçu beaucoup d'aide ci-dessous. Pourquoi ne pas retourner la faveur et upvote de bonnes réponses et accepter le meilleur? –

Répondre

4

Si

socket = new Socket(hostName, 80); 

lance une exception alors socket sera nulle et

proxyConnection.bind(socket, params); 

va lancer une NullPointerException, que vous faites pas attraper.

+0

ohhhhh, vous avez raison, c'est une exception de pointeur nul – Noona

+1

C'est 'IllegalArgumentException', mais c'est la bonne réponse. – erickson

+0

c'est une exception NullPointerException déguisée :) – Bozho

0

pourrait-il que votre programme est tout simplement venir à sa conclusion naturelle (sorties de la principale méthode)? Si votre programme quitte en raison d'une exception générée par la méthode principale, il doit être imprimé sur la console. Pouvez-vous fournir cette trace de pile? Etes-vous certain que l'exception a été interceptée?

+0

non, il ne devrait pas déjà quitter à ce stade, j'ai ajouté la trace de la pile dans l'édition. – Noona

2

Votre bloc d'attrape seulement attrape certaines exceptions. Une exception d'exécution pourrait être obtenir jeté qui ne serait pas pris ..

+0

Oui, pour autant que je sache, lorsqu'une exception est détectée, elle est vraiment interceptée. Mais les exceptions d'exécution peuvent échouer (ce sont des exceptions non contrôlées). –

+0

oui, c'est dans la pile que j'ai collé dans le montage. – Noona

+0

Comme l'a dit Marcus, vous pouvez vérifier qu'une exception d'exécution n'est pas levée. Vous pouvez tester cela en mettant votre méthode dans une tentative d'attraper. par exemple. try { bindProxySocket (proxyConn, nomHôte, paramètres1); Catch (Exception e) { e.printStackTrace(); } – mpd

0

Peut-être proxyConn est nulle, et parce que

if (!proxyConnection.isOpen()) 

il est pas dans un bloc try/catch il peut générer une exception non gérée qui provoque votre programme pour quitter.

+0

non, s'il vous plaît jeter un oeil à la pile. – Noona

0

Pour répondre à certaines de vos questions: que se passe-t-il si j'attrape à nouveau l'exception même si elle est déjà dans la méthode?

Pour le dire simplement, vous ne pouvez pas. Une fois qu'une exception est attrapée une fois, elle ne se trouve plus en haut de la pile, donc toute autre tentative pour l'attraper échouera

Que dois-je faire si je veux nettoyer les ressources uniquement si une exception se produit et sinon je veux continuer avec le programme?

Si vous voulez effectuer une action, n'importe quelle action, seulement lorsqu'une exception se produit, vous devriez le faire dans votre bloc catch.

Je suppose que dans ce cas je dois inclure le code entier jusqu'à ce que je puisse nettoyer les ressources avec une instruction try ou puis-je le faire dans l'instruction handle exception?

je l'ai déjà répondu à cette question avec celle ci-dessus: P

Comme je l'ai dit dans mon commentaire sur le post de marcus vous devez mettre un crochet try autour de l'appel à la fonction elle-même pour faire en sorte que toutes les autres exceptions être attrapé. Vous pouvez savoir quoi faire à partir de là quand vous savez quelles exceptions ne sont pas prises.

try{ 
bindProxySocket(proxyConn, hostName, params1); 
} 
catch(Exception e){ 
e.printStackTrace(): 
} 
+0

C'est aussi une bonne pratique de nettoyer les ressources dans l'instruction finally, mais je pensais que le bloc try serait grand si vous faites trop de choses dans ce morceau de code jusqu'à ce que vous atteigniez le point où vous voulez nettoyer Ressources. – Noona

0

Vous ne devez pas continuer le code après une exception qui peut entraîner que le code ne peut pas continuer.

Ressaisissez votre code comme suit:

Socket socket = null; 
    try { 
     socket = new Socket(hostName, 80); 
     try 
     { 
      proxyConnection.bind(socket, params); 
     } 
     catch(IOException e) 
     { 
      System.err.println ("couldn't bind socket"); 
      e.printStackTrace(); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Une meilleure pratique est juste de laisser cette exception aller et déclarer un throws dans votre méthode. Vous ne devez gérer l'exception que si cela est logique. Ne supprimez pas les exceptions en imprimant simplement la trace puis en continuant le flux du programme.

+0

Oui c'est la cause générale dans la plupart des cas (?), Mais c'était une exigence dans le devoir puisqu'il s'agit d'une application serveur, vous ne voulez pas que votre serveur s'effondre et cesse de servir d'autres clients s'il échoue avec un seul client. – Noona