A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李叶 黑马帝   /  2011-9-3 10:14  /  3221 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在张孝祥老师的交通灯控制系统视频中,在第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 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

2 个回复

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

但是,线程代码中是可以抛出错误(Error)和运行级别异常(RuntimeException)的。Error俺们可以忽略,因为通常Error是应该留给vm的,而RuntimeException确是比较正常的,如果在运行过程中满足了某种条件导致线程必须中断,可以选择使用抛出运行级别异常来处理

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-6 18:16:42
藤椅
嗯,谢谢~已经明白了!回答的很清楚呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马