2010-04-23 187 views
1

这个问题与java异常有关,为什么有一些情况下,即使异常被捕获并且没有exit()语句,当抛出异常时程序仍然退出? 我的代码看起来是这样的处理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(); 
     } 
    } 
} 

然后

我把这种方法是这样的:

bindProxySocket(proxyConn, hostName, params1); 

但是,程序退出,但我想通过做一些事情来处理异常否则,它可能是因为我没有在try catch子句中包含方法调用?如果我再次捕获异常,即使它已经在方法中,会发生什么?以及如果我想只在发生异常时清除finally子句中的资源,否则我该怎么办?否则,我想继续执行该程序?我猜在这种情况下,我必须包括整段代码,直到我可以用try语句清理资源,或者我可以在句柄异常声明中执行它吗? 这些问题中的一部分是针对这个特定情况的,但我希望对我的所有问题都有一个全面的答案供将来参考。感谢

编辑:

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

给出异常的堆栈跟踪将会很有帮助。 – Bozho 2010-04-23 17:41:16

+0

Noona,你在下面给了很多很棒的帮助。为什么不回报这个好处并且提出好的答案并且接受最好的答案? – 2010-04-23 20:29:42

回答

4

如果

socket = new Socket(hostName, 80); 

抛出一个异常,那么socket将是无效和

proxyConnection.bind(socket, params); 

将抛出一个NullPointerException,你做不抓住。

+0

ohhhhh,你说得对,它是一个空指针异常 – Noona 2010-04-23 17:52:42

+1

它是'IllegalArgumentException',但这是正确的答案。 – erickson 2010-04-23 17:53:36

+0

这是一个伪装的NullPointerException :) – Bozho 2010-04-23 18:25:10

0

难道是因为你的程序是简单地来很自然的结论(从退出的主要方法)?

如果您的程序因主方法抛出的异常而退出,则应将其打印到控制台。你能提供这个堆栈跟踪吗?

+0

不,它不应该在此时退出,我在编辑中添加了堆栈跟踪。 – Noona 2010-04-23 17:51:58

2

你确定发现异常吗?您的catch块只能捕获某些异常。运行时异常可以得到抛出这不会被抓到..

+0

是的,据我所知,当发现异常时,它确实被捕获。但运行时异常可能会通过(它们是未经检查的异常)。 – 2010-04-23 17:47:15

+0

是的,它在我编辑时粘贴的堆栈中。 – Noona 2010-04-23 17:50:42

+0

就像Marcus说的,你可能想要检查运行时异常没有被抛出。你可以通过把你的方法放在try catch中来测试。例如 尝试bindProxySocket(proxyConn,hostName,params1); } catch(Exception e){ e.printStackTrace(); } – mpd 2010-04-23 17:59:48

0

可能是proxyConn是空的,因为

if (!proxyConnection.isOpen()) 

它不是在一个try/catch块可能产生使你的程序退出未处理的异常。

+0

不,请看看堆栈。 – Noona 2010-04-23 17:51:36

0

回答你的一些问题:如果我再次发现异常,即使它已经在方法中,会发生什么?

简而言之,你不能。一旦异常被捕获一次,它不再位于堆栈顶部,因此任何进一步的尝试都将失败

如果我只想在发生异常时清除资源,并且我想要继续该计划?

如果你想做一些动作,任何动作,只有当发生异常时,你应该在你的catch块中做到这一点。

我猜在这种情况下,我必须包括整段代码,直到我可以用try语句清理资源,或者我可以在句柄异常声明中执行它吗?

我已经回答了上面的一个这样的问题:P

就像我在上马库斯发表评论说,你应该把一个尝试捕捉调用函数自身周围,以确保任何其他的例外是被抓住了。当你知道什么异常没有被捕获时,你可以从那里弄清楚该怎么做。

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

清理finally语句中的资源也是一种很好的做法,但我认为如果在代码段中做了太多事情之后try块会很大,直到达到您想要清理的地步资源。 – Noona 2010-04-23 21:13:32

0

您应该在可能导致代码无法继续的异常之后继续执行代码。

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

更好的做法就是让这种异常去和你的方法声明throws

如下重写代码。你应该只处理异常,处理它是有意义的。不要通过打印跟踪来抑制异常,然后继续执行程序流程。

+0

是的,这是大多数情况下的一般原因,但由于它是服务器应用程序,因此它是作业中的一项要求,如果只有一个客户端失败,您不希望服务器崩溃并停止为其他客户端提供服务。 – Noona 2010-04-23 21:03:19