今天在看hadoop源碼時,想想自己最近在做的那個系統,發現很多異常處理的方式不對,還是按照傳統的異常處理方式(即:采用返回值來標識程序出現的異常情況)。而hadoop中很多方法的聲明是有異常拋出的,而我的系統中的很多方法的聲明都沒有拋出異常。只是判斷了異常情況,並輸出了錯誤提示,但是並沒有拋出異常。
org.apache.hadoop.hdfs.protocol包下的Block類的readFields()方法:
public void readFields(DataInput in) throws IOException { this.blockId = in.readLong(); this.numBytes = in.readLong(); this.generationStamp = in.readLong(); if (numBytes < 0) { throw new IOException("Unexpected block size: " + numBytes);//拋出異常,要是的話就不會拋出,而只是System.out.println錯誤提示, }
1.如果方法聲明名里面有throws異常,那么方法體里面可以不拋出異常。因為可以在方法聲明中包含異常說明,但實際上卻不拋出!這樣做的好處是,為異常先占個位置,以后就可以拋出這種異常而不用修改修改已有的代碼。在定義抽象基類和接口時這種能力很重要,這樣派生類或接口實現類就能夠拋出這些預先聲明的異常。
2.為什么有的方法聲明里面沒有throws,但方法體里面卻拋出了異常?從RuntimeException繼承的異常,可以在沒有異常說明throws的情況下被拋出!對於Runtime異常(也稱為非檢查的異常unchecked exception),編譯器不需要異常說明。只能在代碼中忽略RuntimeException(及其子類)類型的異常,其他類型的異常的處理都是由編譯器強制實施的。究其原因,RuntimeException代表的是編程錯誤。
3.運行時異常會被Java虛擬機自動拋出!
《有效處理Java異常三原則》http://www.importnew.com/1701.html
其他參考文章:
http://klyuan.iteye.com/blog/72170
http://blog.csdn.net/luqin1988/article/details/7970792
http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html 對應的譯文,不怎么准確:http://blog.sciencenet.cn/blog-252888-761119.html
http://www.oschina.net/question/92866_15634
