異常
常見錯誤類型
- 用戶錯誤輸入
- 設(shè)備錯誤
- 物理限制
- 代碼錯誤
異常分類
Java中的異常對象由Throwable派生而來,可分為Error和Exception兩個分支箫章。其中烙荷,Error類錯誤屬于內(nèi)部錯誤,如果出現(xiàn)檬寂,除了通告給用戶终抽,并盡力使程序安全的終止外,再也無能為力了。這種情況很少出現(xiàn)昼伴。
Exception類可分為兩個RuntimeException和IOException匾旭。
- RuntimeException
RuntimeException由程序錯誤導(dǎo)致,包含以下幾種情況:- 錯誤的類型轉(zhuǎn)換
- 數(shù)組訪問越界
- 訪問空指針
- IOException
IOException是程序本身沒問題亩码,但由于像I/O錯誤這類問題導(dǎo)致的異常,包括:- 試圖在文件尾部后面讀取數(shù)據(jù)野瘦;
- 試圖打開一個不存在的文件描沟;
- 試圖根據(jù)給定的字符串查找Class對象,而這個字符串表示的類并不存在鞭光;
創(chuàng)建異常類
class FileFormatException extends IOException{
public FileFormatException (){}
public FileFormatException (String gripe){
super(gripe);
}
}
String readData(BufferedReader in) throws FileFormatException{
...
while(...){
if (ch == -1){
if (n < len)
throw new FileFormatException();
}
...
}
return s;
}
斷言
assert 條件
或
assert 條件:表達式
如
assert x > 0 : x;
斷言機制將會對條件進行判斷吏廉,當(dāng)不滿足條件是,會拋出一個AssertionError異常惰许,在第二種形式中席覆,表達式會以字符串的形式傳入AssertionError的構(gòu)造器,并打印出來汹买。斷言檢查只用于開發(fā)和測試階段佩伤,當(dāng)代碼發(fā)布時,這些插入的檢測語句將會被自動的移走晦毙。
日志
日志記錄器級別
- SEVER
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
在默認情況下生巡,只記錄前三個級別。也可以設(shè)置其他的級別见妒。如
logger.setLevel(Level.FINE);
默認情況下孤荣,日志配置文件存在于:jre/lib/logging.properties
創(chuàng)建新的日志
通過 Logger.getLogger() 方法創(chuàng)建新 Logger,這個方法接收一個 String 參數(shù)须揣,用于指定 Logger 的名字盐股。如果指定名字的 Logger 已經(jīng)存在,那么只需要返回已經(jīng)存在的 Logger耻卡;否則疯汁,程序會創(chuàng)建一個新 Logger。
通常情況下卵酪,一種好的做法是涛目,我們在當(dāng)前類下使用 class.getName() 作為新 Logger 的名字。示例:
Logger logger = Logger.getLogger(MyClass.class.getName());
記錄日志事件
logger.log() 方法除了日志消息以外凛澎,還需要一個日志級別作為參數(shù):logger.log(Level.WARNING, "This is a warning!");大部分日志框架都針對輸出特定級別日志提供了快捷方式霹肝。例如,下面語句的作用和上面語句的作用是一樣的:logger.warning("This is a warning!")塑煎;你還可以阻止 Logger 輸出低于指定日志級別的消息沫换。在下面的示例中,Logger 只能輸出等于或者高于WARNING 級別的日志消息,并丟棄日志級別低于WARNING的消息:
logger.setLevel(Level.WARNING);
調(diào)試技巧
- 打印變量值讯赏;
System.out.println("x=" + x);
或
Logger.getGlobal().info("x=" + x);
- 在每一個類中放置一個main方法垮兑,這樣就可以對每一個類進行單元測試;
- JUnit單元測試框架漱挎;
- 日志代理是一個子類的對象系枪,它可以竊取方法調(diào)用,并進行日志記錄磕谅,然后調(diào)用超類中的方法私爷;
- 利用Throwable類提供的printStackTrace方法,可以從任何一個異常對象中獲得堆棧情況膊夹;
- 利用printStackTrace(PrintWriter s)方法將堆棧跟蹤信息發(fā)送到一個文件中衬浑;
- 將程序錯誤信息保存在一個文件中;