`
ayis
  • 浏览: 187178 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

抛了异常之后,损失的是一个线程?

    博客分类:
  • java
阅读更多
我们来看这段代码:
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);
	}
}

 

 执行结果,自己去试下

分享到:
评论
6 楼 ayis 2008-11-13  
bloodrate 写道

子线程抛出异常中止会不会对主线程有影响???

不会,垮掉的最多是一个线程
5 楼 bloodrate 2008-11-13  
子线程抛出异常中止会不会对主线程有影响???
4 楼 lqql 2008-11-13  
这个....这个.....
3 楼 ayis 2008-11-13  
taupo 写道
希望对你有帮助

谢谢!你说得很详细!非感谢你!
2 楼 taupo 2008-11-13  
希望对你有帮助
1 楼 taupo 2008-11-13  
我说下我对异常的理解  吧

JVM使用栈来跟踪每个线程中方法调用的轨迹,也就是说每个现在都有一个栈。
在这个栈中,栈顶就是正在执行的方法,并且可以一直回溯到栈底,显然栈底就是main了。当某个方法被调用的时候,这个方法就被压入栈顶。

当方法中代码发生异常时,我们有2种选择
1、直接在该方法中try/catch,如果try中代码有异常发生,那么就直接执行catch中的代码,发生异常那条语句后的语句(若有)将不执行。
2、直接在代码中抛出异常
   此时,JVM会从栈中弹出该方法,并在上一层调用方法继续处理这个异常。JVM必须找到能处理该异常的处理器,如果不存在,就继续弹方法,进入前一个方法中查找处理器。。。。如果一直没有捕获,最终会上溯到main方法中,若main还没有捕获,那么线程就会异常终止,若该线程是主线程,程序退出。

对于UnCheckException,JVM不要求我们一定要捕获或者抛出,UnCheckException
对程序来说好像是透明的,而对CheckException
来说,JVM要求我们必须捕获或者抛出。

一般来说在程序中捕获异常对性能造成的影响比较小,这也和具体的捕获地点有关,越靠近异常发生的地方捕获,性能损失就越小。越远,性能损失越大,因为JVM定位异常处理代码块需要进行大量的工作。

所有,尽量不要使用异常机制来控制程序的正常流程,而且应该在程序可能出现异常的地方捕获。原则就是就近处理

相关推荐

    Java并发编程面试题(2022最新版)

    **当一个线程进入一个对象的synchronized方法A之后,其他线程是否可进入此对象的synchronized方法B** - 不可以,因为同一对象上的所有`synchronized`方法互斥。 **synchronized、volatile、CAS比较** - **...

    JAVA程序员面试32问

    ` 这条语句创建了两个对象:一个在字符串常量池中,另一个是通过`new`创建的对象。 - `Math.round(11.5)` 返回12,`Math.round(-11.5)` 返回-11。 - `short s1 = 1; s1 += 1;` 这条语句是正确的,编译器会自动...

    java本科实验报告

    然而,当尝试将一个`int`或`long`值赋给`float`变量时,由于精度损失,需要显式地进行类型转换,如`float f = (float)12345678;`。 2. **算术运算与数据精度**:在进行浮点数运算时,例如将`int`类型改为`float`...

    java 面试题

    继承是面向对象编程中的另一个关键特性,它允许创建一个新类(子类)继承现有类(父类)的属性和方法。这不仅提高了代码的复用性,还使得类之间的关系更加清晰。例如,“轿车”类可以从“汽车”类中继承所有属性和...

    J2se外企it面试题

    26. **synchronized方法与锁**:一个线程进入对象的synchronized方法后,其他线程无法进入该对象的其他synchronized方法,但可以进入非synchronized方法。 27. **try-finally执行顺序**:finally块中的代码总是在...

    从原码解析ArrayList

    在多线程环境下,如果一个线程正在遍历ArrayList,而另一个线程同时修改了ArrayList的结构(例如添加或删除元素),可能会导致两种不同的行为。"安全失败"允许遍历继续,但返回的结果可能不正确,因为遍历的是...

    java面试题

    单例模式确保一个类只有一个实例,并提供全局访问点。常用实现方式有饿汉式、懒汉式等。 #### 19. 实现3个整数a、b、c的最大值 通过条件语句或`Math.max()`函数可以实现三者之间的最大值计算。 #### 20. String...

    Java面试题1

    `throws`用于声明方法可能抛出的异常,`throw`用于抛出一个异常。 44. 运行时异常是不强制声明的,受检异常需要显式处理。两者都继承自`Exception`类,但运行时异常继承自`RuntimeException`。 45. 常见的运行时...

    MyEditTextApplication输入框BigDecimal计算价格

    它接收两个参数,第一个是保留的小数位数,第二个是舍入模式。之后,我们再将格式化的BigDecimal转换回字符串,并设置到EditText中显示。 5. **异常处理**:在处理用户输入时,我们需要考虑各种异常情况,比如无效...

    java面向对象基础练习

    ` 主动抛出了一个 `Exception` 类型的异常。由于这个异常被 `catch (Exception e)` 所捕获,所以程序会输出 `"Caught in main()"`。之后,`System.out.println("nothing");` 这一行也会被执行,输出 `"nothing"`。...

    java源码包---java 源码 大量 实例

    从内存中清除,从账户中取出amt,如果amt&gt;账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB...

    高级.Net程序设计

    4. **异常处理**:详述.NET中的异常模型,包括如何抛出和捕获异常,最佳实践以及如何使用try-catch-finally语句进行异常处理。 5. **集合与数据结构**:介绍.NET框架提供的各种集合类,如ArrayList、LinkedList、...

    Java面试宝典2011版

    - 一个类可以实现多个接口,但只能继承一个抽象类。 - 抽象类可以包含构造器、字段、静态方法等,而接口不能。 **20. abstract 方法能否与 static、native 和 synchronized 一起使用** - **背景:** Java 中 ...

    Effective.Modern.C++-42.Specific.Ways.to.Improve.Your.Use.of.C++11.and.C++14

    2. **noexcept规范**:noexcept是C++11中引入的一个关键字,用于指明函数不会抛出异常。书中对noexcept的使用给出了详细的说明,并指出其对于提高代码效率和优化异常安全性的贡献。 3. **完美转发**:完美转发允许...

    百度2020校招Java研发工程师面试题笔试题(第三批).docx

    - 给定一个空栈和一组数据,要达到2 5 4 1 3的顺序,分析各选项,不可能是4 1 3 5 2,因为1和3不能在4之后同时出现。 10. **SQL查询**: - 要求输出以'州'结尾的城市数量降序排列的省份及其数量,且输出第二多和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt&gt;账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt&gt;账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始...

    java源码包2

    从内存中清除,从账户中取出amt,如果amt&gt;账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...

    java源码包3

    从内存中清除,从账户中取出amt,如果amt&gt;账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...

    java源码包4

    从内存中清除,从账户中取出amt,如果amt&gt;账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...

Global site tag (gtag.js) - Google Analytics