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);
}
}
}