[19/03/21-星期四] 异常(Exception) (一)
一、引言
? ? ? ? ?在實際工作中,我們遇到的情況不可能是非常完美的。比如:你寫的某個模塊,用戶輸入不一定符合你的要求;你的程序要打開某個文件,
這個文件可能不存在或者文件格式不對 ,你要讀取數據庫的數據,數據可能是空的;我們的程序在運行,但是內存或硬盤可能滿了等等。
軟件程序在運行過程中,非常可能遇到剛剛提到的這些問題,我們稱之為異常,英文是:Exception,意思是例外。遇到這些例外情況,或者叫異常,
我們怎么讓寫的程序做出合理的處理,安全的退出,而不至于程序崩潰呢?
? ? ? 異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等。
? ? ??在Java的異常處理機制中,引進了很多用來描述和處理異常的類,稱為異常類。異常類定義中包含了該類異常的信息和對異常進行處理的方法。
? ? ??所謂異常處理,就是指程序在出現問題時依然可以正確的執行完。
? ? ? Java是采用面向對象的方式來處理異常的。處理過程:
? ? ? 1.?拋出異常:在執行一個方法時,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,并把異常對象提交給JRE。
? ? ??2. 捕獲異常:JRE得到該異常后,尋找相應的代碼來處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼為止。
【示例】 除數不能為0,會拋出算術異常,把程序停掉
二、分類(Error :不需要自己管,發動機異常;Exception:小問題分運行異常和檢查異常)
?
【區別】
? ? ? Error是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機
運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。Error表明
系統JVM已經處于不可恢復的崩潰狀態中。我們不需要管它。
Error與Exception的區別
? ? ? 1.? 我開著車走在路上,一頭豬沖在路中間,我剎車。這叫一個異常。
? ? ? 2. ?我開著車在路上,發動機壞了,我停車,這叫錯誤。系統處于不可恢復的崩潰狀態。發動機什么時候壞?我們普通司機能管嗎?不能。發動機什么時候壞是汽車廠發動機制造商的事。
三、Exception(重點關注)
? ? ? Exception是程序本身能夠處理的異常,如:空指針異常(NullPointerException)、數組下標越界異常(ArrayIndexOutOfBoundsException)、類型轉換異常(ClassCastException)、
算術異常(ArithmeticException)等。?Exception類是所有異常類的父類,其子類對應了各種各樣可能出現的異常事件。 通常Java的異常可分為:
? ? ? 1. CheckedException 已檢查異常
? ? ? ? ? ?所有不是RuntimeException的異常,統稱為Checked Exception,又被稱為“已檢查異常”,如IOException、SQLException等以及用戶自定義的Exception異常。 這類異常在編
譯時就必須做出處理,否則無法通過編譯。
??
? ? ? ?2、 RuntimeException 運行時異常??
? ? ? ? ? ? ?這類異常通常是由編程錯誤導致的,所以在編寫程序時,并不要求必須使用異常處理機制來處理這類異常,經常需要通過增加“邏輯處理來避免這些異常”。
? ? ? ? ?(1)??ArithmeticException 算術異常? ?如:試圖除以0?
? ? ? ? ?(2)??NullPointerException 空指針異常? ? ?如:當程序訪問一個空對象的成員變量或方法,或者訪問一個空數組的成員時會發生空指針異常? ?解決方法:通常是增加非空判斷
? ? ? ? ?(3)??ClassCastException? 類型轉換異常
? ? ? ? ?(4)? ArrayIndexOutOfBoundsException? 數組下標越界異常? 如:當程序訪問一個數組的某個元素時,如果這個元素的索引超出了0~數組長度-1這個范圍
? ? ? ? ?(5)?NumberFormatException 數字格式異常??如:在使用包裝類將字符串轉換成基本數據類型時,如果字符串的格式不正確,則會出現數字格式異常? 方法:引入正則表達式
?鏈接:http://www.sxt.cn/Java_jQuery_in_action/six-runtimeexception.html
【代碼示例】
1 /*測試異常類 2 * 3 * 4 */ 5 package cn.sxt.exception; 6 7 import java.util.regex.Matcher; 8 import java.util.regex.Pattern; 9 10 public class Test_0321_ExceptionClass { 11 public static void main(String[] args) { 12 int a=0,b=1; 13 if(a!=0){ //加個判斷,避免算術異常(ArithmeticException) 14 System.out.println(b/a); 15 } 16 17 String str=null; 18 if (str!=null) {//加個判斷,避免空指針異常(NullPointerException) 19 System.out.println(str.length()); 20 } 21 22 23 Animal d=new Dog();//類型轉換異常(ClassCastException)。 24 if (d instanceof Cat) {//instance:例子 instanceof 判斷其左邊對象是否為其右邊類的實例,返回判斷值Boolean 25 Cat c=(Cat)d; //如果不加外邊的判斷會拋出異常,因為d是dog類不能強制轉換成Cat類。含義如果d是貓類則轉換,否則不轉 26 } 27 28 29 int[] arr = new int[5];//數組下標越界異常(ArrayIndexOutOfBoundsException) 30 //System.out.println(arr[5]); 越界arr下標最多為4 31 int a1 = 5; 32 if (a1 < arr.length) {//解決方案 33 System.out.println(arr[a1]); 34 } 35 36 String str3 = "1234abcf";//數字格式異常(NumberFormatException)。 在使用包裝類將字符串轉換成基本數據類型時,如果字符串的格式不正確 37 // System.out.println(Integer.parseInt(str3)); 會報異常 38 39 Pattern p = Pattern.compile("^\\d+$");//解決方案:正則匹配 40 Matcher m = p.matcher(str3); 41 if (m.matches()) { // 如果str匹配代表數字的正則表達式,才會轉換 42 System.out.println(Integer.parseInt(str3)); 43 } 44 45 46 } 47 48 } 49 class Animal{ 50 51 } 52 class Dog extends Animal{ 53 54 } 55 class Cat extends Animal{ 56 57 }?
轉載于:https://www.cnblogs.com/ID-qingxin/p/10579223.html
總結
以上是生活随笔為你收集整理的[19/03/21-星期四] 异常(Exception) (一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u净app怎么那么多广告(Wikiped
- 下一篇: 苹果手机王者怎么玩安卓号?