3.18 異常處理和日誌相關
阿新 • • 發佈:2019-03-18
args factor 中斷 好用 繼續 jar包 nts {} 自己
因為分母不能為0,所以此時,控制臺會輸出異常,如下圖所示:
如圖所見,當系統運行到a為異常時就不會繼續往下運行了,所以後一個輸出的“測試”語句不會被執行。
所以我們需要try/catch/finally(捕獲/處理/結束)方法,請看下面一段代碼:
這裏給出了異常的解決方法——
將可能會發生異常的語句放入try的大括號中,catch後的小括號中填寫一個新建的異常名,finally為最後的結束塊。
註意,不管程序運行走沒有catch,走了幾個catch,最後都要執行finally塊中的語句。
註意,不管是否拋出異常,finally都要執行
接下來編寫主函數:
異常(Exception)
- 編譯期間出現的問題有什麽?
- 1.異常(Exception)
- 2.警告(Warning)
- 3.錯誤(Error)
- 常見的異常有哪些?
- 1.數組越界
- 2.空指針異常
- 3.控制臺輸入異常
- 4.棧溢出異常(內存溢出)
那麽,如果出現了異常,用什麽方法來解決?
此時引入 try/catch/finally(捕獲/處理/結束)
我們假設引入一個最簡單的異常:算術異常
public class ForthClass {
public static void main(String[] args) {
int a = 1/0;
System.out.println(a);
System.out.println("測試");
}
}
因為分母不能為0,所以此時,控制臺會輸出異常,如下圖所示:
如圖所見,當系統運行到a為異常時就不會繼續往下運行了,所以後一個輸出的“測試”語句不會被執行。
所以我們需要try/catch/finally(捕獲/處理/結束)方法,請看下面一段代碼:
try{
try{
int a = 1/0;
}catch (ArithmeticException e){ //括號中填寫的是異常名 也可以只寫Exception
e.printStackTrace(); //打印異常,不過輸出的是紅字,然後繼續運行
}finally {
System.out.println("測試finally"); //無論上面發生了啥,走沒走catch 最後都會執行finally塊
}
這裏給出了異常的解決方法——
將可能會發生異常的語句放入try的大括號中,catch後的小括號中填寫一個新建的異常名,finally為最後的結束塊。
註意,不管程序運行走沒有catch,走了幾個catch,最後都要執行finally塊中的語句。
異常也可以進行嵌套,請看下面一段代碼:
try{
try{int a = 1/0;
}catch (ArithmeticException e){
System.out.println("可以嵌套");
e.printStackTrace();
}
int[] b = new int[10];
b[20] = 100;
}catch (ArithmeticException e){
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
System.out.println("數組越界");
}finally {
System.out.println("測試finally");
}
System.out.println("hello");
}
拋出異常
先編寫一個有異常語句的方法:
public static void test() throws Exception {
//模擬拋出異常
try{
int[]b = new int[10];
b[30] = 200;
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
throw new Exception("數組越界"); //throw就是拋出異常的語句
}finally {
System.out.println("測試");
}
}
註意,不管是否拋出異常,finally都要執行
接下來編寫主函數:
public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
//在上述語句中,throws後為拋出異常,誰調用這個方法異常就由誰來處理
try {
test();
} catch (Exception e) {
e.printStackTrace();
}
}
總結
- 異常的運行機制
- 1.在try塊中,如果捕獲了異常,那麽try塊中剩余的代碼都不會執行,會直接跳到catch塊中;
- 2.在try後 必須要跟catch或finally;
- 3.catch可以有多個 ,用來應對多種異常;
- 4.可以嵌套try-catch-finally;
- 5.拋出異常throw 異常對象,可以再程序任何需要的位置拋出 作用是中斷程序的執行 直接拋出異常;
日誌
為什麽要引入日誌?
在實際開發中,不可能會有人無時無刻關註服務器的輸出內容,需要讓程序自己把控制臺的內容記錄下來。
只要在出現問題的時候,開發人員可以查詢log記錄。- 在log中需要關註的級別有哪四個?
- debug
- info
- warn
- error
日誌的引入步驟(使用log4j和slf4j日誌框架)
- 掛載log4j.jar包/slf4j的兩個包
- 在src目錄下配置log4j.properties文件
- 編寫日誌工具類(logger屬性和LOGGER輸出)
日誌工具類:
public class SecClass {
//全部大寫
final static Logger LOGGER = Logger.getLogger(SecClass.class); //括號裏是當前類的類名
public static void main(String[] args) {
LOGGER.info("test");
LOGGER.debug("測試");
LOGGER.error("錯誤");
LOGGER.warn("警告");
try {
int a = 1/0;
} catch (Exception e) {
e.printStackTrace();
LOGGER.error(e); //輸出error
}
}
}
樣例輸出:
debug.log
error.log
info.log
warn.log
slf4j.jar相關
- 為什麽使用slf4j而不是log4j或其他?
- 1.slf4j只是規定了一堆接口,並不牽扯具體的日誌實現 可以讓項目脫離某個日誌框架的依賴;
- 2.好用;
代碼編寫:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ThirdClass {
final static Logger LOGGER = LoggerFactory.getLogger(com.lanou.ThirdClass.class); //同log4j
public static void main(String[] args) {
LOGGER.debug("測試模式");
LOGGER.info("信息");
LOGGER.warn("警告");
LOGGER.error("錯誤");
String name = "張三";
int age = 22;
String address = "大連";
String birthday = "1999-3-20";
String id = "123456789";
LOGGER.info("我叫:{},今年:{},家住在:{},生日是:{},身份證號是:{}",name,age,address,birthday,id); //方便輸出法
}
}
樣例輸出:
debug.log
error.log
info.log
warn.log
附錄(工程、jar包及工具)
- log4j.jar
鏈接:https://pan.baidu.com/s/1IlFLjm1wKG_JjHn1w4B8QA
提取碼:11ws
- slf4j.jar
1.slf4j-api-1.7.25.jar
鏈接:https://pan.baidu.com/s/1aesO8I6Xr75CYWO2uViOmg
提取碼:ncby
2.slf4j-log4j12-1.7.25.jar
鏈接:https://pan.baidu.com/s/1OFzPby6ngEa1cacoU5Tm6A
提取碼:2zzl
- log4j配置文件(log4j.properties)
鏈接:https://pan.baidu.com/s/1-3z0ShEmuaY8JAWAOclBsg
提取碼:w1hr
- 工程:2019318Lesson_10異常處理和日誌
鏈接:https://pan.baidu.com/s/1GaZfm5fJWYAt6KbmlP48QQ
提取碼:6g87
3.18 異常處理和日誌相關