JAVA中的異常機制


 Java異常處理的五個關鍵字:try、catch、finally、throw、throws 

在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象。那麼,拋出一個異常具體如何操作呢?

1.創建一個異常對象。封裝一些提示信息(信息可以自己編寫)。

2.需要將這個異常對象告知給調用者。怎麼告知呢?怎麼將這個異常對象傳遞到調用者處呢?通過關鍵字throw 就可以完成。throw 異常對象。 throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行。

使用格式:throw new 異常類名(參數);

throw new NullPointerException("要訪問的arr數組不存在");   
throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出範圍");
public class ThrowDemo {     
    public static void main(String[] args) {         
        //創建一個數組                  
        int[] arr = {2,4,52,2};         
        //根據索引找對應的元素          
        int index = 4;         
        int element = getElement(arr, index); 
          
        System.out.println(element);         
        System.out.println("over");     
    }     
    /*
     * 根據 索引找到數組中對應的元素
     */     
    public static int getElement(int[] arr,int index){          
        //判斷  索引是否越界          
        if(index<0 || index>arr.length‐1){              
            /*
            判斷條件如果滿足,當執行完throw拋出異常對象後,方法已經無法繼續運算。
            這時就會結束當前方法的執行,並將異常告知給調用者。這時就需要通過異常來解決。
            */              
            throw new ArrayIndexOutOfBoundsException("哥們,角標越界了~~~");         
        }         
        int element = arr[index];         
        return element;     
    } 
}

修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{ }

public class ThrowsDemo2 {    
    public static void main(String[] args) throws IOException {         
        read("a.txt");     
    }       
    public static void read(String path) throws FileNotFoundException, IOException {
            if (!path.equals("a.txt")) {//如果不是 a.txt這個文件              
            // 我假設  如果不是 a.txt 認爲 該文件不存在 是一個錯誤也就是異常throw
            throw new FileNotFoundException("文件不存在");         
        }         
        if (!path.equals("b.txt")) {             
            throw new IOException();         
        }     
    } 
}

finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因爲異常會引發程序跳轉,導致有些語句執行 不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
 


自定義異常

要求:我們模擬註冊操作,如果用戶名已存在,則拋出異常並提示:親,該用戶名已經被註冊。
首先定義一個登陸異常類RegisterException:
 

// 業務邏輯異常 
public class RegisterException extends Exception {     
    /**      
      * 空參構造      
      */     
    public RegisterException() {     }       

    /**           
      * @param message 表示異常提示      
      */     
    public RegisterException(String message) {         
        super(message);     
    } 
}

模擬登陸操作,使用數組模擬數據庫中存儲的數據,並提供當前註冊賬號是否存在方法用於判斷。
 

public class Demo {     
    // 模擬數據庫中已存在賬號     
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {                  
        //調用方法         
        try{               
            // 可能出現異常的代碼             
            checkUsername("nill");             
            System.out.println("註冊成功");//如果沒有異常就是註冊成功
        }catch(RegisterException e){             
            //處理異常             
            e.printStackTrace();         
        }     
    }       

    //判斷當前註冊賬號是否存在     
    //因爲是編譯期異常,又想調用者去處理 所以聲明該異常  
    public static boolean checkUsername(String uname) throws LoginException{
        for (String name : names) {             
            if(name.equals(uname)){//如果名字在這裏面 就拋出登陸異常 
                throw new RegisterException("親"+name+"已經被註冊了!");             
            }         
        }         
        return true;     
    } 
}

多線程

併發:指兩個或多個事件在同一個時間段內發生

並行:指兩個或多個事件在同一時刻發生(同時發生)。

進程:是指一個內存中運行的應用程序,每個進程都有一個獨立的內存空間,一個應用程序可以同時運行多 個進程;進程也是程序的一次執行過程,是系統運行程序的基本單位;系統運行一個程序即是一個進程從創建、運行到消亡的過程。

線程:線程是進程中的一個執行單元,負責當前進程中程序的執行,一個進程中至少有一個線程。一個進程 中是可以有多個線程的,這個應用程序也可以稱之爲多線程程序。 簡而言之:一個程序運行後至少有一個進程,一個進程中可以包含多個線程
 

Java中通過繼承Thread類來創建並啓動多線程的步驟如下:

1. 定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務,因此把 run()方法稱爲線程執行體。

2. 創建Thread子類的實例,即創建了線程對象

3. 調用線程對象的start()方法來啓動該線程

測試類:

public class Demo01 {
    public static void main(String[] args) {
        //創建自定義線程對象          
        MyThread mt = new MyThread("新的線程!");
        //開啓新線程
        mt.start();
        //在主方法中執行for循環
        for (int i = 0; i < 10; i++) {
            System.out.println("main線程!"+i);
        }
    }
}  

自定義線程類:
 

public class MyThread extends Thread {
    //定義指定線程名稱的構造方法      
    public MyThread(String name) {
        //調用父類的String參數的構造方法,指定線程的名稱
        super(name);
    }
      
    /**       
      *重寫run方法,完成該線程執行的邏輯       
      */      
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName()+":正在執行!"+i);
        }
    }
}

 

發佈了37 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章