spring-test dao空指针异常_014、Java异常机制
1.異常的概念和分類
異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等。
在Java的異常處理機制中,引進了很多用來描述和處理異常的類,稱為異常類。異常類定義中包含了該類異常的信息和對異常進行處理的方法。
異常的分析
public class Test{public static void main(String[] args) {int i=1/0; //除數為0System.out.println(i);} }Java是采用面向對象的方式來處理異常的。處理過程:
1. 拋出異常:在執行一個方法時,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,并把異常對象提交給JRE。
2. 捕獲異常:JRE得到該異常后,尋找相應的代碼來處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼為止。
/*** 異常:程序在執行的過程出現的非正常情況,異常一旦發生必須進行處理,否則將導致程序中斷執行。* Java中的異常分類:* java.lang.Throwable* --java.lang.Error:嚴重錯誤* --java.lang.Exception:異常(例外)* ---java.lang.RuntimeException:運行時異常(不需要顯示捕獲處理)* ----java.lang.ArithmeticException:算術異常(除零出現異常)* -----java.uitl.InputMismatchException:輸入不 匹配異常* ----checked Exception:檢查異常(必須顯示捕獲處理,否則無法通過編譯)* java處理異常的機制:* 1.try...catch..finally* try{* //可能出現異常的代碼;* }catch(異常的類型 e){* //異常處理* }...* }finally{* //一定會被執行的代碼* }*2.throws...throw*/ import java.util.InputMismatchException; import java.util.Scanner;public class Test1 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {System.out.println("請輸入第一個數:");int num1 = scanner.nextInt();//java.uitl.InputMismatchException:輸入不 匹配異常System.out.println("請輸入第二個數:");int num2 = scanner.nextInt();//java.uitl.InputMismatchException:輸入不 匹配異常int result = num1/num2;//java.lang.ArithmeticException:算術異常System.out.println("result="+result);}catch(ArithmeticException e) {System.out.println("除數不能為零!");e.printStackTrace();//打印堆棧跟蹤信息}catch(InputMismatchException e) {System.out.println("輸入不匹配,請輸入數字!");e.printStackTrace();}System.out.println("程序正常結束!");} }異常分類
Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception。
Exception又分為RuntimeException:運行時異常、CheckedException:已檢查異常
Error:是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。
Exception:Exception是程序本身能夠處理的異常,如:空指針異常(NullPointerException)、數組下標越界異常(ArrayIndexOutOfBoundsException)、類型轉換異常(ClassCastException)、算術異常(ArithmeticException)等。
Java異常類的層次結構圖
2.常見簡單異常的解決方法
RuntimeException運行時異常
常見的運行時異常:RuntimeException
1.java.lang.ArithmeticException:算術異常
2.java.uitl.InputMismatchException:輸入不 匹配異常
3.java.lang.NullPointerException:空指針異常
4.java.lang.ArrayIndexOutOfBoundsException:數組下標越界
5.java.lang.StringIndexOutOfBoundsException: 字符串下標越界
6.java.lang.ClassCastException:類型轉換異常
7.java.lang.NumberFormatException:數字轉換異常
Checked Exception檢查時異常
1. IOException
2. FileNotFoundException
3. ClassNotFoundException
4. PassException
5. NullPointException
/*** 常見的運行時異常:RuntimeException* 1.java.lang.ArithmeticException:算術異常* 2.java.uitl.InputMismatchException:輸入不 匹配異常* 3.java.lang.NullPointerException:空指針異常 **** 4.java.lang.ArrayIndexOutOfBoundsException:數組下標越界**** 5.java.lang.StringIndexOutOfBoundsException: 字符串下標越界 **** 6.java.lang.ClassCastException:類型轉換異常 **** 7.java.lang.NumberFormatException:數字轉換異常 ***** 日期:2019年7月*/ public class TestRuntimeException {public static void main(String[] args) { // //空指針異常 // String str = null; // str.length(); // //數組下標越界 // int[] nums = new int[5]; // System.out.println(nums[5]); // //字符串下標越界 // String str2 = "hello"; // System.out.println(str2.charAt(8));//類型轉換異常 // Animal animal = new Dog(); // Cat cat =(Cat)animal;String str3 = "abc";int i =Integer.parseInt(str3);//Integer.parseInt(String str):將字符串轉換為整數System.out.println(i);} } class Animal{ } class Dog extends Animal{ } class Cat extends Animal{ }/*** 常見的運行時異常:RuntimeException* 1.java.lang.ArithmeticException:算術異常* 2.java.uitl.InputMismatchException:輸入不 匹配異常* 3.java.lang.NullPointerException:空指針異常 **** 4.java.lang.ArrayIndexOutOfBoundsException:數組下標越界**** 5.java.lang.StringIndexOutOfBoundsException: 字符串下標越界 **** 6.java.lang.ClassCastException:類型轉換異常 **** 7.java.lang.NumberFormatException:數字轉換異常 **** ...* 如何避免異常:通過嚴謹的判斷防止潛在的運行時異常發生。*/ public class TestRuntimeException2 {public static void main(String[] args) {//空指針異常String str = null;if(str!=null) {str.length();//空指針異常,試圖訪問空對象的屬性或方法}//數組下標越界int[] nums = new int[5];int index = 5;if(index<nums.length) {System.out.println(nums[index]);}} }異常的處理方式有兩種:使用“try/catch”捕獲異常、使用“throws”聲明異常。
3.異常處理方式之一__捕獲異常
捕獲異常是通過3個關鍵詞來實現的:try-catch-finally。用try來執行一段程序,如果出現異常,系統拋出一個異常,可以通過它的類型來捕捉(catch)并處理它,最后一步是通過finally語句為異常處理提供一個統一的出口,finally所指定的代碼都要被執行(catch語句可有多條;finally語句最多只能有一條,根據自己的需要可有可無)。
捕獲異常關鍵字(try catch finally)
try-catch 組合
用try來執行,如果出現異常,系統拋出異常,可以通過catch來捕捉并處理它
一個try語句必須帶有至少一個catch語句塊或一個finally語句塊
注意事項
當異常處理的代碼執行結束以后,不會回到try語句去執行尚未執行的代碼。
import java.util.Scanner;public class TestTryCatch {public static void main(String[] args) {Scanner input =new Scanner(System.in);try {System.out.println("請輸入被除數:");int numA=input.nextInt();System.out.println("請輸入除數:");int numB=input.nextInt();int result=numA/numB;System.out.println(numA+"/"+numB+"="+result);}catch(ArithmeticException e) {//ArithmeticException e = new InputMismatchException 不成功//catch(Exception e) {//相當于Exception e=new ArithmeticException()多態的表示形式,父類引用指向了子類 //ArithmeticException算術異常e.printStackTrace();}System.out.println("程序結束,謝謝您的使用");} }try-finally 組合
finally 是無論是否產生異常,都執行的代碼,但是有一種情況 finally 不執行,即退出 Java 虛擬機。
import java.util.Scanner;public class TestTryFinally {public static void main(String[] args) {Scanner input =new Scanner(System.in);try {System.out.println("請輸入被除數:");int numA=input.nextInt();System.out.println("請輸入除數:");int numB=input.nextInt();int result=numA/numB;System.out.println(numA+"/"+numB+"="+result);//退出java虛擬機System.exit(0);}finally {System.out.println("finally中的代碼");}} }try-catch-finally 組合
程序首先執行可能發生異常的try語句塊。如果try語句沒有出現異常則執行完后跳至finally語句塊執行;如果try語句出現異常,則中斷執行并根據發生的異常類型跳至相應的catch語句塊執行處理。catch語句塊可以有多個,分別捕獲不同類型的異常。catch語句塊執行完后程序會繼續執行finally語句塊。finally語句是可選的,如果有的話,則不管是否發生異常,finally語句都會被執行。
public class TestTryCatchFinally {public static void main(String[] args) { // //1.try..catch // try { // int result = 1/1; // System.out.println(result); // }catch(Exception e) { // e.printStackTrace(); // } // //2.try...finally // try { // System.out.println("try中的代碼.."); // int result = 1/0; // }finally { // System.out.println("finally中的代碼..."); // }//3.try...catch...finallytry {System.out.println("try中的代碼..");int result = 1/0;}catch(Exception e) {System.out.println("catch中的代碼...");}finally {System.out.println("finally中的代碼...");}} }注意事項
1. 即使try和catch塊中存在return語句,finally語句也會執行。是在執行完finally語句后再通過return退出。
2. finally語句塊只有一種情況是不會執行的,那就是在執行finally之前遇到了System.exit(0)結束程序運行。
4.異常的處理方式之二:聲明異常(throws子句)
聲明異常的關鍵字 throws
方法名的后面,用于聲明該方法可能會產生一個異常如果方法聲明的是 Exception 類型的異常或者是 Checked Exception 異常,要求方法的調用處必須做處理。
(1)繼續使用 throws 向上(方法的調用處)聲明
(2)使用 try-catch-finally 進行處理
如果聲明的是 RuntimeException 類型的異常,那么方法的調用處可處理可不處理。
繼承關系中的聲明異常
1) 父類的方法聲明了 Exception 類型的異常,子類在重寫方法時,可以聲明也可以不聲明。但是如果子類重寫 后的方法使用super 關鍵字調用父類的方法,那么要求必須對異常進行處理。
2) 如果父類的方法沒有異常,那么子類的方法如果一定會有 Exception 或 Checked 異常,要求子類必須自己使用 try-catch 處理,或者給父類方法加上異常的聲明
3) 如果子類在重寫父類的方法時,產生的異常是RuntimeException 異常時,那么可以不用處理
throw 拋出異常對象
在捕獲一個異常前,必須有一段代碼先生成異常對象并把它拋出。這個過程我們以手工做,也可以由 JRE 來實現,但是他們調用的都是 throw 子句。
throws 與 throw
(1)throws 用于聲明方法可能會產生的異常類型
throw 手動拋出異常對象
(2) throws 寫在方法名稱后面
throw 用于寫在方法里
import java.io.File; import java.io.IOException; /*** throws與throw* 通過throws聲明異常:跟在方法聲明的后邊,用于告知方法的調用者該方法有可能存在異常。* 方法的調用者可以使用try...catch...finally捕獲異常或者使用throws繼續講異常聲明出去。* 通過throw拋出異常:放在方法的內部,用于拋出異常,經常與throws結合使用。* throws與throw區別* 1.位置不同:throws放在方法聲明的后邊,用于聲明該方法可能出現的異常,throw放在方法的內部,用于拋出具體的異常對象。* 2.類型不同:throws后跟聲明異常的是異常的類型,throw后根具體的異常對象。*/ public class TestThrows {public static void test()throws Exception{}public static void test2()throws Exception{File file = new File("D:/aa.txt");try {file.createNewFile();//創建文件IOException屬于檢查異常,必須進行處理才能通過編譯。}catch(IOException e) {e.printStackTrace();throw e;//拋出異常,后邊跟異常對象}}public static void main(String[] args) {/*throws Exception{*/ // try { // test(); // }catch(Exception e) { // e.printStackTrace(); // }}}5.自定義異常
1.在程序中,可能會遇到JDK提供的任何標準異常類都無法充分描述清楚我們想要表達的問題,這種情況下可以創建自己的異常類,即自定義異常類。
2.自定義異常類只需從Exception類或者它的子類派生一個子類即可。
3.自定義異常類如果繼承Exception類,則為受檢查異常,必須對其進行處理;如果不想處理,可以讓自定義異常類繼承運行時異常RuntimeException類。
4.習慣上,自定義異常類應該包含2個構造器:一個是默認的構造器,另一個是帶有詳細信息的構造器。
自定義異常類
/*** 自定義異常:可能會遇到JDK提供的任何標準異常類都無法充分描述清楚我們想要表達的問題,這種情況下可以創建自己的異常類,即自定義異常類* 實現步驟:* 1.編寫一個類繼承exception* 2.編寫該類的構造方法,并在構造方法中調用父類(Exception)中的構造方法為消息賦值。* 3.可以通過getMessage()方法獲取消息信息。*/ public class AgeException extends Exception{public AgeException(String message) {super(message);//調用父類的構造方法} }自定義異常類的使用
public class Person {private String name;private int 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 AgeException{if(age>0&&age<150) {this.age = age;}else {throw new AgeException("年齡必須在0-150之間");//年齡不符合要求,拋出異常}}@Overridepublic String toString() {return "person [name="+name+",age="+age+"]";}public static void main(String[] args) {Person person = new Person();person.setName("zhangsan");try { // person.setAge(20);person.setAge(-20);}catch(AgeException e) {System.out.println(e.getMessage());//獲取消息信息// e.printStackTrace();}System.out.println(person);} }使用異常機制的建議
1.要避免使用異常處理代替錯誤處理,這樣會降低程序的清晰性,并且效率低下。
2.處理異常不可以代替簡單測試---只在異常情況下使用異常機制。
3.不要進行小粒度的異常處理---應該將整個任務包裝在一個try語句塊中。
4.異常往往在高層處理(先了解!后面做項目會說!) 。
總結
以上是生活随笔為你收集整理的spring-test dao空指针异常_014、Java异常机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html仿手机界面,javascript
- 下一篇: java线程如何避免死锁_Java面试问