黑马程序员技术交流社区

标题: 关于多线程向控制台输出异常信息的问题 [打印本页]

作者: 李叶    时间: 2011-9-3 10:14
标题: 关于多线程向控制台输出异常信息的问题
在张孝祥老师的交通灯控制系统视频中,在第10节的20分钟左右出现过这样一个问题,代码如下:[code=java]Lamp nextLamp = Lamp.valueOf(next);
if (next != null) {
  nextLamp.light();
}[/code]在这段代码中,我们可以看到
如果next传入的值是定义的几个枚举对象以外的值,例如传入"abc"
那么Lamp.valueOf(next)就无法找到相应的Lamp对象
那么Lamp.valueOf(next)返回给nextLamp的值也就是null
这样,在调用nextLamp.light();时,就会抛出NullPointerException异常
但是为什么NullPointerException这个异常信息没有在控制台被打印出来呢?有办法可以让它打印出来吗?

补充:也许这个问题看起来不太好理解……我还是举通用一点的例子吧
假设有这样一段代码:[code=java]List <String> list = new ArrayList ();
list.remove(0);[/code]由于list刚刚被初始化,所以里面没有内容,这样调用remove(0)的话就会抛出IndexOutOfBounds异常
如果在main函数中直接调用这两行代码,就可以看到控制台会输出这个异常的信息
但是,如果在一个线程中使用这段代码的话,控制台就不会输出这个异常的信息

不知道这样表述是否清楚……

[ 本帖最后由 李叶 于 2011-09-03  10:30 编辑 ]
作者: 匿名    时间: 2011-9-5 00:12
这么来看待这个问题。首先明确线程代码的边界。其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界。Runnable接口中run方法原型如下:
<<
public void run();
>>
而所有的具体线程都实现这个方法,所以这里就明确了一点,线程代码不能抛出任何checked异常。所有的线程中的checked异常都只能被线程本身消化掉。:) 这样本身也是符合线程的设计理念的,线程本身就是被看作独立的执行片断,它应该对自己负责,所以由它来消化所有的checked异常是很正常的。
这样就回答了楼主的第一个问题:checked异常一定要在线程内部消化。

但是,线程代码中是可以抛出错误(Error)和运行级别异常(RuntimeException)的。Error俺们可以忽略,因为通常Error是应该留给vm的,而RuntimeException确是比较正常的,如果在运行过程中满足了某种条件导致线程必须中断,可以选择使用抛出运行级别异常来处理
作者: 匿名    时间: 2011-9-6 18:16
嗯,谢谢~已经明白了!回答的很清楚呵呵




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2