package com.heima.exception; public class Demo1_Exception { public static void main(String[] args) { //demo1(); Demo d = new Demo(); int x = d.div(10, 0); System.out.println(x); } public static void demo1() { int[] arr = {11,22,33,44,55}; //arr = null; //NullPointerException 空指針異常 System.out.println(arr[10]); //ArrayIndexOutOfBoundsException 數組索引越界異常 } } class Demo { /* * 除法運算 */ public int div(int a,int b) { //a = 10,b = 0 return a / b; // 10 / 0 被除數是10,除數是0當除數是0的時候違背了算數運算法則,拋出異常 //new ArithmeticException("/ by zero"); } }
package com.heima.exception; public class Demo2_Exception { public static void main(String[] args) { Demo2 d = new Demo2(); try{ int x = d.div(10, 0); System.out.println(x); }catch(ArithmeticException a) { //ArithmeticException a = new ArithmeticException(); System.out.println("出錯了,除數爲零了"); } System.out.println("1111111111111111"); } } class Demo2 { /* * 除法運算 */ public int div(int a,int b) { //a = 10,b = 0 return a / b; // 10 / 0 被除數是10,除數是0當除數是0的時候違背了算數運算法則,拋出異常 //new ArithmeticException("/ by zero"); } }
package com.heima.exception; public class Demo3_Exception { public static void main(String[] args) { //demo1(); int a = 10; int b = 0; int[] arr = {11,22,33,44,55}; //JDK7如何處理多個異常 try { System.out.println(a / b); System.out.println(arr[10]); } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println("出錯了"); } } public static void demo1() { int a = 10; int b = 0; int[] arr = {11,22,33,44,55}; try { System.out.println(a / b); System.out.println(arr[10]); arr = null; System.out.println(arr[0]); } catch (ArithmeticException e) { System.out.println("除數不能爲零"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("索引越界了"); } catch (Exception e) { //Exception e = new NullPointerException(); System.out.println("出錯了"); } System.out.println("over"); } }
A:編譯期異常和運行期異常的區別java
全部的RuntimeException類及其子類的實例被稱爲運行時異常,其餘的異常就是編譯時異常程序員
編譯時異常面試
package com.heima.exception; import java.io.FileInputStream; public class Demo4_Exception { /** 編譯時異常也叫作未雨綢繆異常(老師本身定義的) 未雨綢繆:在作某些事情的時候要作某些準備 編譯時異常:在編譯某個程序的時候,有可能會有這樣那樣的事情發生,好比文件找不到,這樣的異常就必須在編譯的時候處理 若是不處理編譯通不過 運行時異常:就是程序員所犯得錯誤,須要回來修改代碼 */ public static void main(String[] args) { try { FileInputStream fis = new FileInputStream("xxx.txt"); } catch(Exception e) { } } }
package com.heima.exception; public class Demo5_Throwable { /** 案例演示 * Throwable的幾個常見方法的基本使用 */ public static void main(String[] args) { try { System.out.println(1/0); } catch (Exception e) { //Exception e = new ArithmeticException("/ by zero"); //System.out.println(e.getMessage()); //獲取異常信息 //System.out.println(e); //調用toString方法,打印異常類名和異常信息 e.printStackTrace(); //jvm默認就用這種方式處理異常 } } }
package com.heima.exception; public class Demo6_Exception { /** 案例演示 * 舉例分別演示編譯時異常和運行時異常的拋出 * 編譯時異常的拋出必須對其進行處理 * 運行時異常的拋出能夠處理也能夠不處理 * @throws Exception */ public static void main(String[] args) throws Exception { Person p = new Person(); p.setAge(-17); System.out.println(p.getAge()); } } class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) throws AgeOutOfBoundsException { if(age >0 && age <= 150) { this.age = age; }else { //Exception e = new Exception("年齡非法"); //throw e; throw new AgeOutOfBoundsException("年齡非法"); } } }
package com.heima.exception; public class Demo7_Finally { /** 案例演示 * finally關鍵字的特色及做用 *return語句至關因而方法的最後一口氣,那麼在他將死以前會看一看有沒有finally幫其完成遺願,若是有就將finally執行 *後在完全返回 */ public static void main(String[] args) { try { System.out.println(10/0); } catch (Exception e) { System.out.println("除數爲零了"); System.exit(0); //退出jvm虛擬機 return; } finally { System.out.println("看看我執行了嗎"); } } }
package com.heima.test; public class Test1 { /** * * A:面試題1 * final,finally和finalize的區別 * final能夠修飾類,不能被繼承 * 修飾方法,不能被重寫 * 修飾變量,只能賦值一次 * * finally是try語句中的一個語句體,不能單獨使用,用來釋放資源 * * finalize是一個方法,當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。 * B:面試題2 * 若是catch裏面有return語句,請問finally的代碼還會執行嗎?若是會,請問是在return前仍是return後。 */ public static void main(String[] args) { Demo d = new Demo(); System.out.println(d.method()); } } class Demo { public int method() { int x = 10; try { x = 20; System.out.println(1/0); return x; } catch (Exception e) { x = 30; return x; } finally { x = 40; //return x; 千萬不要在finally裏面寫返回語句,由於finally的做用是爲了釋放資源,是確定會執行的 //若是在這裏面寫返回語句,那麼try和catch的結果都會被改變,因此這麼寫就是犯罪 } } }
package com.heima.exception; public class Demo8_Exception { /** 案例演示 * 自定義異常的基本使用 */ public static void main(String[] args) { } } class AgeOutOfBoundsException extends Exception { public AgeOutOfBoundsException() { super(); } public AgeOutOfBoundsException(String message) { super(message); } }
B:如何使用異常處理算法
區別:數據庫
若是JDK沒有提供對應的異常,須要自定義異常。數組
package com.heima.test; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class Test2 { /** * 鍵盤錄入一個int類型的整數,對其求二進制表現形式 * 若是錄入的整數過大,給予提示,錄入的整數過大請從新錄入一個整數BigInteger * 若是錄入的是小數,給予提示,錄入的是小數,請從新錄入一個整數 * 若是錄入的是其餘字符,給予提示,錄入的是非法字符,請從新錄入一個整數 * * 分析: * 1,建立鍵盤錄入對象 * 2,將鍵盤錄入的結果存儲在String類型的字符串中,存儲int類型中若是有不符合條件的直接報錯,沒法進行後續判斷 * 3,鍵盤錄入的結果轉換成int類型的數據,是正確的仍是錯誤的 * 4,正確的直接轉換 * 5,錯誤的要進行對應判斷 */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入一個整數:"); while(true) { String line = sc.nextLine(); //將鍵盤錄入的結果存儲在line中 try { int num = Integer.parseInt(line); //將字符串轉換爲整數 System.out.println(Integer.toBinaryString(num));//將整數轉換爲二進制 break; //跳出循環 }catch(Exception e) { try { new BigInteger(line); System.out.println("錄入錯誤,您錄入的是一個過大整數,請從新輸入一個整數:"); }catch (Exception e2) { //alt + shif + z (try catch快捷鍵) try { new BigDecimal(line); System.out.println("錄入錯誤,您錄入的是一個小數,請從新輸入一個整數:"); } catch (Exception e1) { System.out.println("錄入錯誤,您錄入的是非法字符,請從新輸入一個整數:"); } } } } } }