今天在公司和同事聊天的時候,突然發現自己對java中的throw、throws和try catch的作用理解不夠准確,在網上查了查,在此大概梳理一下。
throw用於拋出異常,例如
throw new NullPointerException();
就是拋出一個空指針異常。異常拋出后程序終止,除非用try catch包圍起來,會在執行完catch和finally塊中的代碼后,繼續執行之后的代碼。這也是try catch的一個作用,即防止程序崩潰。
throws用於聲明一個方法可能拋出某種異常,提醒調用者處理。例如
void test() throws NullPointerException {
}
意思是這個test方法可能會拋出空指針異常,調用者可能需要處理。為什么說可能需要處理,因為有些異常不處理也可通過編譯,有些則不行。需要處理的異常為非運行時異常,如IOException、SQLException和自定義Exception;不需要處理的異常為運行時異常,如NullPointerException、IndexOutOfBoundsException等。前者必須try catch處理,否則無法通過編譯,后者則不需要。
對於運行時異常,雖然編譯器不強制要求處理,但是在不處理的情況下,異常會一直向上拋出,直至最上層為止。多線程最后會由Thread.run()拋出,單線程則由main()拋出,然后程序終止。
try catch就是處理異常的方式。需要明確的一點是,即便沒有try catch(准確說是沒有catch塊中的e.printStackTrace()或別的打印異常信息語句),控制台還是會打印異常的堆棧信息。反而如果有try catch,但是catch塊中沒有打印異常信息的話,控制台中就會空空如也。這也是許多規范中嚴禁catch塊中什么都不做的原因,至少應該在日志中記錄異常信息,因為try catch相當於接管了java本身的異常處理,雖然這使得我們可以在發生異常時做很多事,但我們若是什么都不做的話,java也不會重新接管。
