/* 自定義異常類 java提供的異常類,不夠我們使用,需要自己定義一些異常類 格式: public class XXXException extends Exception/runtimeException{ 添加一個空參數的構造方法 添加一個帶異常信息的構造方法 } 注: 1.自定義異常類一般是Exception結尾,說明該類是一個異常類 2.必須繼承Exception/RuntimeException */ public class RegisterException extends Exception { //添加一個帶空參數的異常 public RegisterException() { } //查看異常源碼可知,可以讓父類的構造方法來解決異常信息 public RegisterException(String message) { super(message); } }
1 import java.util.Scanner; 2 3 /** 4 * 利用異常,模擬注冊功能 5 */ 6 7 public class IsRegister { 8 //1.數組保存已經注冊的用戶名(數據庫) 9 static String[] usename = {"趙", "王", "孫"}; 10 11 public static void main(String[] args) /*throws RegisterException*/ { 12 //2.一般從前端獲取數據源 13 Scanner sc = new Scanner(System.in); 14 System.out.println("請輸入用戶名: "); 15 String name = sc.nextLine(); 16 checkUsename(name); 17 18 } 19 //3.定義一個方法對用戶輸入的數據進行判斷 20 public static void checkUsename(String name) /*throws RegisterException*/ { 21 for (String usename : usename) { 22 if(usename.equals(name)){ 23 try { 24 throw new RegisterException("用戶已注冊"); //運行期異常,可以不用throws和try catch 25 } catch (RegisterException e) { 26 e.printStackTrace(); 27 return;//結束 28 } 29 } 30 } 31 //注冊成功 32 System.out.println("注冊成功"); 33 } 34 }
/* //Throwable所有異常的超類 Exception -編譯異常,可以throws或者try{}catch{} -子類 RuntimeException -運行異常,可以不處理,讓JVM處理 Error -無法處理,必須修改源代碼,內存溢出,系統崩潰 -子類 異常處理過程:方法里面異常,查看有沒有異常處理邏輯,若沒有 ——把內容,原因,位置報告JVM——找到方法的調用者(main) ——查看有沒有異常處理邏輯,若沒有——返回給JVM,JVM控制台打印,並且中斷程序 //運行時異常 throw關鍵字 作用:可以使用throw關鍵字在指定的方法中拋出指定的異常 格式:throw new xxxException("異常產生的原因") 注:1.throw關鍵字必須在方法的內部 2.throw關鍵字new的必須是Exception或其子類對象 3.throw關鍵字拋出指定的異常對象,我們必須處理這個對象 1.throw關鍵字后邊創建的是RuntimeException或其子類對象,可以交給JVM(打印異常+中斷程序) 2.throw關鍵字后邊創建的是編譯異常(寫代碼的時候),要么throws,要么try catch 工作中,必須對對方傳遞過來的方法進行合法化校驗,不合法,則拋出異常的方式給到調用者 //編譯異常 throws關鍵字:異常處理的第一種方式,交給被人處理 作用: 當方法的內部拋出異常對象的時候,那么我們就必須處理這個異常對象 throws將異常對象聲明(內容,原因,位置)給調用者,自己不處理,最終會交付給JVM 格式: 修飾符 返回值類型 方法名(參數列表)throws XXXException,XXX,XXX{ throw new XXXException("異常的原因") } 注意:throws 后面的異常聲明必須是Exception或其子類 方法內部如果有多個異常對象,throws必須聲明多個 如果異常對象有子父類對象,直接聲明父類異常即可 此外,如一旦聲明拋出異常的方法,就必須處理該異常,要么繼續在調用對象throws聲明異常,最后交給方法調用者最后交給JVM,中斷 要么try...catch自己處理(一般這種比較好)不中斷 try catch:異常處理的第二種方式,自己處理 格式:try{ 可能異常的代碼 }catch(定義一個異常變量接受try中異常變量){ 異常處理邏輯,工作中會把信息記錄進日志 } ... catch(定義一個異常變量接受try中異常變量){ 異常處理邏輯,工作中會把信息記錄進日志 } 注:try中可能有對個異常對象,所以需要多個catch來處理 如果try中產生異常,就會執行catch的異常處理邏輯,繼續執行之后的代碼 如果catch里的異常類有父子類關系,子類應該寫在上邊(二義性),Exception所有的異常類 finally 格式:try{ 可能異常的代碼 }catch(定義一個異常變量接受try中異常變量){ 異常處理邏輯,工作中會把信息記錄進日志 } ... catch(定義一個異常變量接受try中異常變量){ 異常處理邏輯,工作中會把信息記錄進日志 }finally{ 無論代碼是否出現異常,這里都會執行 } 注:finally不能單獨使用,必須與try一起用,finally一般用於資源釋放,無論程序是否有異常,均需要釋放資源 */ import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; public class Throwable { public static void main(String[] args) /*throws IOException*/ { //RuntimeException可以不用自己處理交給JVM //int[] num=new int[5]; //getElement(num,6); //編譯異常,需要自己處理,使用throws //readFile("c:\\b.txt");不會執行,因為上面的異常JVM讓程序已經中斷 //使用try catch try { readFileC("c:\\b.txt"); //有可能出現異常的代碼 } catch (ArrayIndexOutOfBoundsException e) {//throws聲明的什么異常,就用來生成對象來接收 //異常處理邏輯 /* Throwable類中定義了三個方法: String toString() - 返回此 throwable 的詳細消息字符串。 StackTraceElement[] getStackTrace() - 提供編程訪問由 printStackTrace() 輸出的堆棧跟蹤信息,JVM打印默認調用此方法 String getMessage() -返回此 throwable 的簡短描述。 */ System.out.println(e.toString()); //java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3 System.out.println(e.getMessage()); //Index 4 out of bounds for length 3 System.out.println(e.getStackTrace()); //[Ljava.lang.StackTraceElement;@4e50df2e }finally { System.out.println("資源釋放"); //finally無論是否異常,均執行 } System.out.println("勞資沒有中斷,太強了"); } public static void getElement(int[] arr, int index) { //運行期異常,可以不用自己處理 if (index > 4 || index < 0) { throw new ArrayIndexOutOfBoundsException("數組索引有問題"); //ArrayIndexOutOfBoundsException運行期異常,交給JVM,不用自己throw } //在Objects里有個判斷NullPointerException的方法可以判斷 對象 是否為空,簡化上述代碼 //格式Objects.requireNonNull(對象名); //另一個重載Objects.requireNonNull(對象名,"拋出的信息") } /* 定義一個方法,對傳遞的文件路徑合法化判斷,使用throws 由於FileNotFoundException extends IOException 所以聲明IOException即可 */ public static void readFile(String src) throws IOException { //拋出文件位置異常 if (!src.equals("c:\\a.txt")) { throw new FileNotFoundException("文件位置不匹配"); } //拋出文件后綴異常 if (!src.endsWith(".txt")) { throw new IOException("文件位置不匹配"); } } public static void readFileC(String src) { List<Integer> integers = List.of(1, 2, 3); integers.get(4); } }