浏览 2722 次
锁定老帖子 主题:抛了异常之后,损失的是一个线程?
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-12
最后修改:2008-11-13
我们来看这段代码: package cn.rjb.test; public class Test { public static void main(String args[]){ for(int i =0 ; i< 10 ;i++){ if(i%3== 0){ thread(("a"+i)); }else{ thread((""+i)); } } } public static void thread(String str){ final String a =str; new Thread( new Runnable(){ public void run(){ method(a); System.out.println(a+"这里执行!"); } } ).start(); } public static void method(String a){ Integer.parseInt(a); } }
打印结果:
1这里执行! 2这里执行! Exception in thread "Thread-3" java.lang.NumberFormatException: For input string: "a3" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:447) at java.lang.Integer.parseInt(Integer.java:497) at cn.rjb.test.Test.method(Test.java:31) at cn.rjb.test.Test$1.run(Test.java:23) at java.lang.Thread.run(Thread.java:619) Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: "a0" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:447) at java.lang.Integer.parseInt(Integer.java:497) at cn.rjb.test.Test.method(Test.java:31) at cn.rjb.test.Test$1.run(Test.java:23)5这里执行! 7这里执行! 4这里执行! at java.lang.Thread.run(Thread.java:619) Exception in thread "Thread-9" java.lang.NumberFormatException: For input string: "a9" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:447) at java.lang.Integer.parseInt(Integer.java:497) at cn.rjb.test.Test.method(Test.java:31) at cn.rjb.test.Test$1.run(Test.java:23) at java.lang.Thread.run(Thread.java:619) 8这里执行! Exception in thread "Thread-6" java.lang.NumberFormatException: For input string: "a6" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:447) at java.lang.Integer.parseInt(Integer.java:497) at cn.rjb.test.Test.method(Test.java:31) at cn.rjb.test.Test$1.run(Test.java:23) at java.lang.Thread.run(Thread.java:619)
抛了异常之后,线程就停止了,并且从异常抛出处后面的代码也不会执行了。 这是我从程序执行的结果看来的,大家有什么意见呢?
解决:
在抛出异常出使用 try--catch 进行捕获,后面就可以继续执行了。
看下面的代码,就可以正常执行了。
package cn.rjb.test; public class Test { public static void main(String args[]){ for(int i =0 ; i< 10 ;i++){ if(i%3== 0){ thread(("a"+i)); }else{ thread((""+i)); } } } public static void thread(String str){ final String a =str; new Thread( new Runnable(){ public void run(){ try{ method(a); }catch(Exception e){ } System.out.println(a+"这里执行!"); } } ).start(); } public static void method(String a){ Integer.parseInt(a); } }
执行结果,自己去试下 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
我说下我对异常的理解 吧
JVM使用栈来跟踪每个线程中方法调用的轨迹,也就是说每个现在都有一个栈。 在这个栈中,栈顶就是正在执行的方法,并且可以一直回溯到栈底,显然栈底就是main了。当某个方法被调用的时候,这个方法就被压入栈顶。 当方法中代码发生异常时,我们有2种选择 1、直接在该方法中try/catch,如果try中代码有异常发生,那么就直接执行catch中的代码,发生异常那条语句后的语句(若有)将不执行。 2、直接在代码中抛出异常 此时,JVM会从栈中弹出该方法,并在上一层调用方法继续处理这个异常。JVM必须找到能处理该异常的处理器,如果不存在,就继续弹方法,进入前一个方法中查找处理器。。。。如果一直没有捕获,最终会上溯到main方法中,若main还没有捕获,那么线程就会异常终止,若该线程是主线程,程序退出。 对于UnCheckException,JVM不要求我们一定要捕获或者抛出,UnCheckException 对程序来说好像是透明的,而对CheckException 来说,JVM要求我们必须捕获或者抛出。 一般来说在程序中捕获异常对性能造成的影响比较小,这也和具体的捕获地点有关,越靠近异常发生的地方捕获,性能损失就越小。越远,性能损失越大,因为JVM定位异常处理代码块需要进行大量的工作。 所有,尽量不要使用异常机制来控制程序的正常流程,而且应该在程序可能出现异常的地方捕获。原则就是就近处理 |
|
返回顶楼 | |
发表时间:2008-11-13
希望对你有帮助
|
|
返回顶楼 | |
发表时间:2008-11-13
taupo 写道 希望对你有帮助
谢谢!你说得很详细!非感谢你! |
|
返回顶楼 | |
发表时间:2008-11-13
这个....这个.....
|
|
返回顶楼 | |
发表时间:2008-11-13
子线程抛出异常中止会不会对主线程有影响???
|
|
返回顶楼 | |
发表时间:2008-11-13
bloodrate 写道 子线程抛出异常中止会不会对主线程有影响??? 不会,垮掉的最多是一个线程 |
|
返回顶楼 | |