Java的異常
1.Java中所有異常和錯誤的基類:Throwable
Throwable
error Exception
(檢查時異常)(運行時異常)
RuntimeException
2.Java中的異常分為運行時異常和檢查時異常
運行時異常是表示RuntimeException以及所有子類,這些異常無需再程序中捕獲,大多可以通過代碼進行控制避免
檢查時異常:除了RuntimeException以及其所有子類之外的所有異常,這些異常必須在程序中進行捕獲處理。
異常的第一種處理機制——使用try-catch進行異常捕獲
1.使用try塊包裹可能出現異常的代碼,使用多個catch塊進行不同異常的處理
當try塊中的程序出現異常時,將進入對應的catch塊進行操作,而不再執行try塊中的代碼
使用try—catch捕獲異常后,如果程序出現異常,將不會阻斷程序的運行
2。catch塊可以有多個,一般最后用catch(Exception e)收尾,表示捕獲所有異常
但多個catch塊順序必須由小到大
3.e.getMessage():拿到錯誤信息
e.printStackTrace(); 打印堆棧信息
4.try catch結構如果需要確保程序不被中斷,必須確保程序塊可以捕獲程序中可能出現的所有異常(最后用catch(Exception e)收尾)
5.finally表示無論程序是否出現異常,都必須執行的語句,即便try塊中有return語句也必須執行完finally才能結束當前方法。
但是使用System.exit(0); 退出程序,將不再執行finally的語句
所以,finally通常用於進行流的關閉,資源釋放等操作
6.try-finally可以組合存在,而不一定必須包含catch
表示出現異常不進行操作,但是finally中的代碼必須執行
異常的第二種處理機制——拋出機制
1.在方法體中如果出現異常,可以不用try-catch捕獲,而使用throws在方法聲明上進行拋出
拋出后,在調用方法的地方進行拋出,如果捕獲可以繼續拋出
原則上,main方法中必須進行異常處理,如果繼續拋出將會導致程序出現異常而無法發現
2.throws如果拋出多個異常,可以使用逗號分隔
3.throw 在程序中手動拋出異常
throw new IOException("輸入年齡不合法");
4.如果使用throw拋出的是一個檢查型異常,那必須在方法體上使用throws進行拋出聲明
如果使用throw拋出的是一個運行時異常,那么不必再使用throws進行拋出聲明。
實例代碼:
try{
setAge(110);
}catch(IOException e) {
e.printStackTrace();
}public static void setAge(int i) throwsIOException{if(i<0||i>100){throw new IOException("輸入年齡不合法");
}
}
如何自定義異常類
自定義異常類,必須繼承現有異常類。
通常繼承Exception或者RuntimeException,分別表示聲明了一個檢查時異常和一個運行時異常。
實例代碼:
class AgeException extendsException{private String message=null;publicAgeException(){
}publicAgeException(String message){this.message=message;
}publicString getMessage(){returnmessage;
}
}class AgeRuntimeException extendsRuntimeException{private String message=null;publicAgeRuntimeException(){
}publicAgeRuntimeException(String message){this.message=message;
}publicString getMessage(){returnmessage;
}
}
log4j的使用
1.導入log4j-1.2.17.jar
2.在src目錄同級下,創建log4j.properties配置文件
3.在需要打印日志的類中通過Logger.getLogger()拿到一個日志對象,參數傳入本類.class
4.使用日志對象,分別調用不同級別的打印語句進行日志的輸出!
log.debug("打印一條debug信息");
log.info("打印一條info信息");
log.warn("打印一條warn信息");
log.error("打印一條error信息");
log4j的配置文件log4j.properties
#log4j.rootLogger 表示根配置。
#log4j.rootLogger=[ level ] , appenderName1 , appenderName2
#level 表示可以寫入日志的級別:
#ERROR> WARN > INFO >DEBUG
#設置info 表示級別大於info的都可以進行日志輸出
# 級別后面的多個選項,表示多個適配器的名字,適配器的名字可以隨便起
log4j.rootLogger=info, logfile,A,B
# 進行各個適配器的配置。 log4j.appender.適配器名字
#[為Appender指定日志輸出目的地]
#org.apache.log4j.ConsoleAppender(控制台),
#org.apache.log4j.FileAppender(文件),
#org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
#org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
log4j.appender.A=org.apache.log4j.ConsoleAppender
# 設置控制台打印的語句。 System.out/System.err
log4j.appender.A.Target=System.err
# 使用哪種布局進行日志顯示:
# org.apache.log4j.HTMLLayout(以HTML表格形式布局),
# org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
# org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
log4j.appender.A.layout=org.apache.log4j.SimpleLayout
log4j.appender.logfile=org.apache.log4j.FileAppender
# 設置文件的地址
log4j.appender.logfile.File=mylog.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
# 為PatternLayout進行樣式的設置。
#%m 輸出代碼中指定的消息
#%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 輸出自應用啟動到輸出該log信息耗費的毫秒數
#%c 輸出所屬的類目,通常就是所在類的全名
#%t 輸出產生該日志事件的線程名
#%n 輸出一個回車換行符,Windows平台為“\r\n”,Unix平台為“\n”
#%d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日 22 : 10 : 28 , 921#%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java: 10)
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
# 為當前適配器,指定單獨的級別,可以覆蓋rootLogger的配置
log4j.appender.logfile.Threshold=warn
# 表示寫入新日志時,是否清空日志文件;false表示清空原文件,true表示在原文件后面追加新日志
log4j.appender.logfile.Append= false