這種“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,就相當於實現了“喊壹聲”的功能。