Java異常處理try?catch的基本使用
1. 異常
1.1 try…catch異常處理
try catch的異常處理的格式寫法 :
try{ 被檢測的代碼 可能發(fā)生異常的代碼 }catch(異常類的類名 變量名){ 異常的處理方式 : 寫什么都可以 定義變量,創(chuàng)建對象,調(diào)用方法,循環(huán),判斷... 只要寫了catch,異常就被處理掉了 }
public static void main(String[] args) { int[] arr = {1}; //try catch異常處理 try { int i = getNum(arr); System.out.println("i = " + i); }catch (Exception ex){ System.out.println("異常被處理掉"); } System.out.println(111); } public static int getNum(int[] arr){ return arr[1] + 10; }
1.2 多catch并行處理
異常處理的代碼中 : try 可以跟隨多個(gè)catch
好處 : 不同的異常,可以區(qū)別對待,分開處理
public static void main(String[] args) { /** * myExec出現(xiàn)2個(gè)異常 * 寫2個(gè)catch分別捕獲異常 */ try { myExec(0); }catch (NullPointerException ex){ System.out.println("處理空指針異常"); }catch (ArrayIndexOutOfBoundsException ex){ System.out.println("處理越界異常"); } } /** * 定義方法,目的引發(fā)異常 * 傳遞參數(shù) : 對參數(shù)進(jìn)行判斷 */ public static void myExec(int i){ if ( i == 0){ //引發(fā)空指針異常 String s = null; int len = s.length(); }else { //引發(fā)越界異常 int[] arr = {}; int a = arr[0]; } }
多個(gè)catch處理異常的時(shí)候,寫法特別注意 : 如果catch中的異常類沒有關(guān)系,先寫后寫沒有區(qū)別, catch中的異常類有繼承關(guān)系,父類寫在最下面
1.3 throw和throws 關(guān)鍵字的使用
throw關(guān)鍵字 : 只能寫在方法內(nèi)部, 關(guān)鍵字的后面跟隨對象的創(chuàng)建
throws關(guān)鍵字 : 只能寫在方法的定義上,關(guān)鍵字后面跟隨異常類名
public static void main(String[] args) { /** * getArea()調(diào)用方法,方法上有異常 * 只能處理,不處理編譯失敗 * 在main的方法上加throws 異常沒有處理,交給JVM處理 * try catch處理 */ try { int area = getArea(-10); System.out.println(area); } catch (Exception e) { e.printStackTrace(); } } /** * 功能: 計(jì)算正方形的面積 * 需要參數(shù) : 邊長 * 語法 : 方法的內(nèi)部出現(xiàn)了異常,必須在方法定義上暴露 */ public static int getArea(int length) throws Exception{ if (length <= 0) //數(shù)據(jù)錯(cuò)誤,導(dǎo)致后面的計(jì)算不能進(jìn)行 //內(nèi)部出現(xiàn)問題 throw new Exception("邊長不存在"); return length * length; }
1.4 finally代碼塊
finally代碼塊跟隨try … catch使用,也有跟隨try使用
finally代碼塊里面的程序,無論是否出現(xiàn)異常,都會(huì)執(zhí)行,必須執(zhí)行
結(jié)束JVM了,finally不執(zhí)行.
主要用于釋放資源
public static void main(String[] args) { try { int[] arr = {1}; System.out.println(arr[0]); }catch (Exception ex){ ex.printStackTrace(); }finally { //后期用于資源的釋放 System.out.println("這里的代碼,必須執(zhí)行"); } }
1.5 RuntimeException異常
異常的父類是Exception,Exception類的子類RuntimeException,凡是RuntimeException和他的所有子類,都稱為運(yùn)行異常,非子類的稱為編譯異常
編譯異常 : 方法出現(xiàn)編譯異常,調(diào)用者必須處理,否則編譯失敗.處理方式可以是try catch或者是throws都可以
運(yùn)行異常 : 方法出現(xiàn)運(yùn)行異常,方法的定義上,不需要throws聲明,調(diào)用者也不需要處理這個(gè)異常
不要處理運(yùn)行異常 : 程序一旦發(fā)生運(yùn)行異常,請程序人員修改源碼
常見的運(yùn)行異常
NullPointerException 空指針
IndexOutOfBoundsException 越界異常
ClassCastException 類型強(qiáng)制
IllegalArgumentException 無效的參數(shù)異常
1.6 自定義異常
Java官方已經(jīng)定義了大量的異常類,但是依然不夠,以后做項(xiàng)目的時(shí)候,會(huì)出現(xiàn)的異常,在JDK中沒有定義的,需要我們自己定義異常
自定義異常,入伙,繼承Exception或者RuntimeException 只有Exception和他的子類,才具有可拋出性
自定義的類中,構(gòu)造方法,super調(diào)用父類構(gòu)造方法,傳遞異常信息
/** * 自定義的異常類 * 成績負(fù)數(shù)的異常 * 繼承哪個(gè)父類呢 * * 自定義異常信息 : 繼承父類 RuntimeException 帶有String類型的構(gòu)造方法 (String 異常信息) */ public class ScoreException extends RuntimeException{ public ScoreException(String s){ super(s); } }
public static void main(String[] args) { // int[] arr = {1}; //System.out.println(arr[2]); int avg = getAvg(-100,2); System.out.println("avg = " + avg); } /** * 計(jì)算成績的平均分 */ public static int getAvg(int math,int chinese){ //判斷成績的數(shù)值 if ( math < 0 || chinese < 0) //手動(dòng)拋出,自己定義的異常 throw new ScoreException("成績不存在"); return (math + chinese) / 2; }
總結(jié)
到此這篇關(guān)于Java異常處理try catch的基本使用的文章就介紹到這了,更多相關(guān)Java異常處理try catch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)SSL雙向認(rèn)證的方法
這篇文章主要介紹了Java實(shí)現(xiàn)SSL雙向認(rèn)證的方法,實(shí)例分析了ssl認(rèn)證的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08IntelliJ IDEA連接MySQL數(shù)據(jù)庫詳細(xì)圖解
今天小編就為大家分享一篇關(guān)于intellij idea連接mysql數(shù)據(jù)庫詳細(xì)圖解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10RocketMQ生產(chǎn)消息與消費(fèi)消息超詳細(xì)講解
這篇文章主要介紹了RocketMQ生產(chǎn)消息與消費(fèi)消息,RocketMQ可用于以三種方式發(fā)送消息:可靠的同步、可靠的異步和單向傳輸。前兩種消息類型是可靠的,因?yàn)闊o論它們是否成功發(fā)送都有響應(yīng)2022-12-12Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的簡單定義與使用方法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的簡單定義與使用方法,簡單描述了隊(duì)列的功能、特點(diǎn),并結(jié)合java實(shí)例形式分析了隊(duì)列的簡單定義與使用方法,需要的朋友可以參考下2017-10-10Springboot項(xiàng)目引入druid安裝部署使用教程
這篇文章主要介紹了Springboot項(xiàng)目引入druid安裝部署使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問
這篇文章主要介紹了通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Mybatis-plus的selectPage()分頁查詢不生效問題解決
本文主要介紹了Mybatis-plus的selectPage()分頁查詢不生效問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01java lambda循環(huán)_使用Java 8 Lambda簡化嵌套循環(huán)操作
這篇文章主要介紹了java lambda循環(huán)_使用Java 8 Lambda簡化嵌套循環(huán)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Spring整合websocket整合應(yīng)用示例(下)
這篇文章主要介紹了Spring整合websocket整合應(yīng)用示例(下)的相關(guān)資料,需要的朋友可以參考下2016-04-04