1. 程式人生 > >Java 提高(4)----- 異常 Logger

Java 提高(4)----- 異常 Logger

異常 Logger

異常分類

此處輸入圖片的描述
所有的異常有Throwable(直接繼承了Object)繼承而來,有兩個子類Error和Exception

  1. Error , 描述了java執行時系統的內部錯誤和資源耗盡錯誤,應用程式不應該丟擲這種型別的錯誤,當出現了這種錯誤,我們只能告訴使用者錯誤型別,安全的終止程式,沒辦法修復程式
  2. Exception層次的錯誤是我們需要關注的,Exception可以分為兩個分支,一個是RuntimeException,由程式錯誤導致的異常是RuntimeException異常,是執行時異常(在執行時才可以發現的異常);另外一個是其他異常(IoException是其中的一個代表),編譯時異常(編譯時可以發現的異常)
Runtime異常:
    錯誤的型別轉換
    陣列訪問越界
    訪問空指標
其他異常:
    試圖在檔案尾部讀取資料
    試圖開啟一個不存在的檔案

Error類和RuntimeException類的所以異常稱為未檢查異常,程式沒有強制我們去處理這部分異常,其他的異常稱為已檢查異常,我們做了相應的處理。

自定義異常

#自定義異常只要類繼承了Exception或者子類就可以
#包含兩個構造器,一個是預設的構造器,另一個是有列印資訊的構造器
public class PrivateException extends Exception {
    public
PrivateException() { } public PrivateException(String message) { super(message); } } #使用 public static void main(String[] args) { for(int i = 0; i < 10;i++){ if(i == 5){ try { //程式碼1 throw new PrivateException(); //程式碼2 throw new PrivateException("I am here error");
} catch (PrivateException e) { e.printStackTrace(); } } } } #程式碼1結果 #demo.Crazy.four.PrivateException #at demo.Crazy.four.Test.main(Test.java:11) #程式碼2結果,程式碼2打印出了我們宣告的錯誤資訊 I am here error #demo.Crazy.four.PrivateException: I am here error #at demo.Crazy.four.Test.main(Test.java:11)

異常的處理

異常的處理有兩種,一種是使用try catch語句捕獲異常進行處理,另一種是使用throws丟擲異常,給方法的呼叫者處理。通常情況下,知道如何處理的異常直接捕獲處理,不知道如何處理的異常要進行異常傳遞。

1.多個catch塊的情況

多個catch塊的情況, try 語句後面新增任意數量的 catch 塊。如果保護程式碼中發生異常,異常被拋給第一個 catch 塊。如果丟擲異常的資料型別與第一個catch塊匹配,它在這裡就會被捕獲。如果不匹配,它會被傳遞給第二個 catch 塊。如此,直到異常被捕獲或者通過所有的 catch塊

2.finally關鍵字

finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。無論是否發生異常,finally程式碼塊中的程式碼總會被執行。

3.try中有return時
try{} 裡有一個 return 語句,那麼緊跟在這個 try 後的 finally{} 裡的 code 會不會被執行,什麼時候被執行,在 return 前還是後?

會執行,在方法返回呼叫者前執行
在finally中改變返回值的做法是不好的,因為如果存在finally程式碼塊,try中的return語句不會立馬返回呼叫者,而是記錄下返回值待finally程式碼塊執行完畢之後再向呼叫者返回其值,然後如果在finally中修改了返回值,就會返回修改後的值。顯然,在finally中返回或者修改返回值會對程式造成很大的困擾,C#中直接用編譯錯誤的方式來阻止程式設計師幹這種齷齪的事情,Java中也可以通過提升編譯器的語法檢查級別來產生警告或錯誤,Eclipse中可以在如圖所示的地方進行設定,強烈建議將此項設定為編譯錯誤。

異常處理技巧

  • 避免過大的try塊,這樣出錯時不容易定位到錯誤
  • 細化異常的型別,不要不管什麼異常都寫成Exception,這樣雖然程式碼可簡單
  • catch塊儘量捕獲一類異常,當你選擇了捕獲異常就應該對它負責,不要只是列印異常,否則就直接丟擲異常
  • 不要把自己能處理的異常丟擲去
  • 不要使用try…catch參與流程控制
  • 在多個catch時在最後加上catch(Exception),避免遺漏異常

Logger機制

在剛開始寫程式的時候會用到好多System.out.println()來得到資訊判斷程式碼錯誤情況,在編碼結束後會發現好多的列印無用資訊,刪除起來又比較麻煩。我們也可以自定義Logutils列印類,通過一個boolean型別的引數來控制除錯期列印,釋出程式不列印,下面簡單寫了一個

public class LogUtils {
    private LogUtils(){throw new AssertionError();}
    //是否列印flag
    private static boolean isPrint = true;
    //log列印語句
    public static void log(String TAG , String msg){
        if(isPrint){
            System.out.println(TAG +": "+msg);
        }
    }
    //關閉log列印
    public static void closeLog(){
        if(isPrint == true){
            isPrint = false;
        }
    }
    //開啟log列印
    public static void openLog(){
        if(isPrint == false){
            isPrint = true;
        }
    }
}

Java本身自帶了Logger類來解決上述問題

#Logger簡單使用,下面全部使用了全域性列印logger
public class Test {
    public static void main(String[] args) {
//        Logger.getGlobal().setLevel(Level.OFF); //在程式開始可以關閉所有列印語句,在釋出期使用
//        Logger.getGlobal().log(Level.FINE,"Open the menu"); //log第一個引數指定了列印級別
        Logger.getGlobal().info("error"); //info()列印級別就是INFO級別
        System.out.println("process exit ");
        }
}

Logger有下面7個日誌級別,就和linux核心中的printk,android中的Log一樣,一般每個級別程式碼列印資訊的嚴重性不同,預設列印INFO及其以上的資訊,可以在${jre}/lib/logging.properties中更改預設配置
- SERVER 最高的
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
下面是網上一個博主分析的程式碼,儲存到本地檔案
http://blog.csdn.net/nash603/article/details/6749914

#輸入檔案到本地日誌檔案
public class LoggerUtil {

    /** 存放的資料夾 **/
    private static String file_name = "郵政儲蓄日誌";

    /**
     * 得到要記錄的日誌的路徑及檔名稱
     * @return
     */
    private static String getLogName() {
        StringBuffer logPath = new StringBuffer();
        logPath.append(System.getProperty("user.home"));
        logPath.append("\\"+file_name);
        File file = new File(logPath.toString());
        if (!file.exists())
            file.mkdir();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        logPath.append("\\"+sdf.format(new Date())+".log");

        return logPath.toString();
    }

    /**
     * 配置Logger物件輸出日誌檔案路徑
     * @param logger
     * @throws SecurityException
     * @throws IOException
     */
    public static void setLogingProperties(Logger logger) throws SecurityException, IOException {
        setLogingProperties(logger,Level.ALL);
    }

    /**
     * 配置Logger物件輸出日誌檔案路徑
     * @param logger
     * @param level 在日誌檔案中輸出level級別以上的資訊
     * @throws SecurityException
     * @throws IOException
     */
    public static void setLogingProperties(Logger logger,Level level) {
        FileHandler fh;
        try {
            String str = getLogName();
            System.out.println(str);
            fh = new FileHandler(str,true);
            logger.addHandler(fh);//日誌輸出檔案
            //logger.setLevel(level);
            fh.setFormatter(new SimpleFormatter());//輸出格式
            //logger.addHandler(new ConsoleHandler());//輸出到控制檯
        } catch (SecurityException e) {
            logger.log(Level.SEVERE, "安全性錯誤", e);
        } catch (IOException e) {
            logger.log(Level.SEVERE,"讀取檔案日誌錯誤", e);
        }
    }

    public static void main(String [] args) {
        Logger logger = Logger.getLogger("sgg");
        try {
            LoggerUtil.setLogingProperties(logger);
            logger.log(Level.INFO, "ddddd");
            logger.log(Level.INFO, "eeeeee");
            logger.log(Level.INFO, "ffffff");
            logger.log(Level.INFO, "gggggg");
            logger.log(Level.INFO, "hhhhhh");
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

相關推薦

Java 提高4----- 異常 Logger

異常 Logger 異常分類 所有的異常有Throwable(直接繼承了Object)繼承而來,有兩個子類Error和Exception Error , 描述了java執行時系統的內部錯誤和資源耗盡錯誤,應用程式不應該丟擲這種型別的錯誤,

java 筆記4接口

ride ide tex disk static關鍵字 方便 理解 pre 抽象方法 interface USB{ void start(); void stop(); } class C{ public static void work(U

java基礎4

進行 cnblogs -- 結束 str 簡潔 img 是否 mage 一、調試 步驟1:設置斷點(不能在空白處設置斷點) 步驟2:啟動調試 步驟3:調試代碼(F6單步跳過) 筆記本Fn+F6(F5) 步驟4:結束調試 掌握調試的好處? 1

Java基礎異常處理關鍵字:try catch finally throw throws

cut main 5.1 模型 指針 str control 情況 實例   嗨咯,大家晚上好,我的博客首篇開始了 ,我們一起加油吧! 都說java 語言是非常健壯性 如:垃圾回收機制、內存模型、異常處理,強類型轉換、跨平臺,等等,使得Java語言的受到青睞。今天我們先來聊

Java學習4:統計一個文件中的英文,中文,數字,其他字符以及字符總數

port let args str reader 文件路徑 要求 cnblogs pub 要求:統計一個文件中的英文,中文,數字,其他字符以及字符總數(此隨筆以txt文件為例) import java.io.BufferedReader; import java.io.F

【Selenium 3+Java自動化4】-八種元素定位

pub nbsp 百度搜索 name tail webdriver nqa pan sss 1 package com.mypro.jase; 2 3 import org.openqa.selenium.By; 4 import org.openqa.sele

java入門4--流程控制

clas 程序 生命 blog 括號 java入門 語言 註入 class 選擇 程序如果只是逐條地順序執行,那程序的行為恐怕要簡單得多了,但也會失去大部分的強悍功能和精彩。 正是“分支”打破了順序執行的呆板局面,給程序註入了真正的生命力。 java中的分支主要由 選擇 和

JAVA基礎4-分支語句

所有 字符 邏輯 def switch sys 如果 div 是否 分支結構: 根據條件的成立與否,選擇執行方向。 (一)if分支結構: 語句1; if(條件表達式){ 代碼塊 //條件成立時,執行的邏輯 }

c理解提高4指標知識體系

指標知識體系搭建 前言          先從整體上把握指標的知識體系。然後突破1級指標、二級指標、多級指標。   指標強化 鐵律1:指標是一種資料型別   &nbs

Java筆記異常

異常 一、概念 一)為什麼會有Java異常機制 在沒有Java異常機制的情況下,唯一的退出機制就是返回值,判斷是否異常的方法就是 返回值。方法根據是否異常返回不同的返回值,呼叫者根據不同的返回值進行判斷。每一 層方法都需要對呼叫的方法的不同返回值進行檢查和處理,程式的正常邏輯和異常邏輯混雜 到一起

java基礎2--異常類&IO流ing

1、異常類 底層是Throwable,直接子類包括Exception和Error。 一般RuntimeException類都是程式設計師錯誤。 2、異常處理 try:用來檢測異常 catch:用來捕獲異常 finally:釋放資源 一個try,可以對應多個catch,一個finally。

Java 學習—— 異常處理

一、異常的概念   異常指的是執行期出現的錯誤,也就是當程式開始執行以後執行期出現的錯誤。出現錯誤時觀察錯誤的名字和行號最為重要。      異常發生的原因: 使用者輸入了非法資料。 要開啟的檔案不存在。 網路通訊時連線中斷,或者JVM記憶

手把手教你做一個新浪部落格釋出軟體JAVA版本4--開啟部落格釋出頁面

       前言:很多人用新浪部落格引流,但是以前可以用api釋出,但是現在已經行不通了,市面上也有諸如新浪部落格批量釋出軟體啦,新浪部落格批量發帖啦,新浪部落格釋出軟體啊等等的各種工具,但是小心中槍,一不小心就封號處理了,所以得不償失,於是乎就想自己寫一個

java集合4:HashMap原始碼分析jdk1.8

前言 Map介面雖然也是集合體系中的重要一個分支,但是Map介面並不繼承自Collection,而是自成一派。 public interface Map<K,V> Map集合儲存鍵對映到值的物件。一個集合中不能包含重複的鍵,每個鍵最多

Java基礎4物件克隆複製

以下介紹兩種不同的克隆方法,淺克隆(ShallowClone)和深克隆(DeepClone)。在Java語言中,資料型別分為值型別(基本資料型別)和引用型別,值型別包括int、double、byte、boolean、char等簡單資料型別,引用型別包括類、介面、陣列等複雜型別

Python4--異常捕獲及處理

異常 異常即非正常狀態,在Python中使用異常物件來表示異常。若程式在編譯或執行過程中發生錯誤,程式的執行過程就會發生改變,丟擲異常物件,程式流進入異常處理。如果異常物件沒有被處理或捕捉,程式就會執

java基礎4Java遞迴演算法

一、遞迴演算法的概念   在一個方法的方法體內,呼叫該方法本身,稱為遞迴 遞迴:包含了一種隱式的迴圈,會重複執行某段程式碼,但是這種重複不需要使用迴圈語句,不會看到for、while、do……while語句 二、思考    遞迴 實現: 求一個數的階乘     使用遞

Java併發4深入分析java執行緒池框架及實現原理

先說說我個人對執行緒池的理解:執行緒池顧名思義是一個裝有很多執行緒的池子,這個池子維護著從執行緒建立到銷燬的怎個生命週期以及執行緒的分配,使用者只需要把任務提交給這個執行緒池而不用去關心執行緒池如何建立執行緒,執行緒池會自己給這些任務分配執行緒資源來完成任務。 java的E

java提高15---java深淺拷貝

stream 變量 object 一個 北京天安門 前言 person urn support #java深淺拷貝 一、前言 為什麽會有深淺拷貝這個概念? 我覺得主要跟JVM內存分配有關,對於基本數據類型,只存在棧內存,所以它的拷貝不存在深淺拷貝這個概念。而對於對象而言,

別樣JAVA學習繼承下(2.3)異常

關閉 exit dsm 練習 方便 pub xtend 運行 script 1、RuntimeException Exception中有一個特殊的子類異常RuntimeException執行時異常。 假設在函數內容拋出該異常,函數上能夠不用聲明。編譯一樣