形象的让你了解到异常的分类!
有一类特殊的异常叫“RuntimeException”,就是“运行时异常”,包括像常见的“NullPointerException”(空指针异常)等,这些异常通通继承于“RuntimeException”类,它们通常是一些无法预先知道的异常,只有在程序运行起来后才能知道到底会不会出现异常。
这种“RuntimeException”是用不着catch住,也不需要throws显式抛出的(当然也允许catch或throws,如果程序确实有需要的话),Java虚拟机会自动把它们向上一层抛出,如果一直没有被catch到,最后就由Java虚拟机catch住,然后在控制台显示出我们平常见到的异常信息,接着程序将被中止。
对于其它不是“RuntimeException”的异常(“非运行时异常”),方法中如果有可能出现,就必须catch住或者用throws显示抛出,否则Java源代码是无法通过编译的。
========
一般在下面这种情况时使用throws:
某个方法中调用了一些会抛出异常方法,而这个方法从业务或逻辑上来说又不太应该处理这种异常,所以由它来catch住异常不好,这时就可以在方法上加上throws把异常交给上一层调用本方法的代码去处理。
总的来说,throws的含义就表示某个方法按照功能,有可能会出现某种异常。
例如:
情况一:有一个方法,功能是接收一个字符串,把按指定格式转换为日期,如果格式不符合,就返回null。
情况二:有一个方法,功能是接收一个字符串,把按指定格式转换为日期,如果格式不符合,就抛出格式不符的异常。
字符串转换日期一般可以用DateFormat抽象类的parse方法(实现类通常是SimpleDateFormat),这个方法会抛出ParseException异常。
那么,
对于情况一,就要用catch抓住异常:
public Date strToDate(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
而对于情况二,就要在方法上加throws来抛出异常:
public Date strToDate(String dateStr) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(dateStr);
}
这两种情况的区别,就在于方法设计的功能实现不同,情况一要求这个方法能够处理字符串格式不对的例外;而情况二只要求这个方法转换格式,对于字符串格式不对的例外,只需要把这个“例外”告诉上层调用它的方法就行了。
比较形像的描述就是:
方法一:你给我一个字符串,我看看它格式对不对,如果不对,就返回给你一个null;如果格式对了,就返回给你正确日期。
方法二:你给我一个字符串,我就返回正确日期;如果格式有问题,我就喊一声“格式有问题!”。
这里的throws,就相当于实现了“喊一声”的功能。 |
|