1. 程式人生 > >3.18 異常處理和日誌相關

3.18 異常處理和日誌相關

args factor 中斷 好用 繼續 jar包 nts {} 自己

異常(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 異常處理和日誌相關