国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JAVA基礎(chǔ)--如何通過(guò)異常處理錯(cuò)誤

瀏覽:5日期:2022-08-31 14:18:18

《Thinking in Java》上對(duì)這章的講解不少,可見(jiàn)重要性,學(xué)習(xí)和總結(jié)一些主要的記錄下來(lái)。

一、創(chuàng)建自定義異常

package Exception; class SimpleException extends Exception{} public class InheritingException{ public void f() throws SimpleException { System.out.println('Throw SimpleException from f()'); throw new SimpleException(); } public static void main(String[] args) { InheritingException sed = new InheritingException(); try { sed.f(); } catch (SimpleException e) { e.printStackTrace(); } } }

輸出:

Throw SimpleException from f()Exception.SimpleExceptionat Exception.InheritingException.f(InheritingException.java:10)at Exception.InheritingException.main(InheritingException.java:19)

throw與throws的區(qū)別與詳情

編譯器創(chuàng)建了默認(rèn)構(gòu)造器,它將自動(dòng)調(diào)用基類(lèi)的默認(rèn)構(gòu)造器。

對(duì)異常來(lái)說(shuō),最重要的部分就是類(lèi)名,其它也沒(méi)用,可以增加一個(gè)帶參的構(gòu)造方法。

比如NullPointerException:

public class NullPointerException extends RuntimeException { private static final long serialVersionUID = 5162710183389028792L; /** * Constructs a {@code NullPointerException} with no detail message. */ public NullPointerException() { super(); } /** * Constructs a {@code NullPointerException} with the specified * detail message. * * @param s the detail message. */ public NullPointerException(String s) { super(s); } }二、捕獲異常

1)try塊

如果在方法內(nèi)部拋出了異常(或者在方法內(nèi)部調(diào)用的其他方法拋出了異常),這個(gè)方法將在拋出異常的過(guò)程中結(jié)束。

要是不希望方法就此結(jié)束,可以在方法內(nèi)設(shè)置一個(gè)特殊的塊來(lái)捕獲異常。

try{ //exceptions }

2)異常處理程序

異常處理程序緊跟在try塊之后,以關(guān)鍵字catch表示:

try{ //exceptions } catch(Type1 id1) { //Type1 } catch(Type2 id2) { //Type2}

當(dāng)異常被拋出時(shí),異常處理機(jī)制將負(fù)責(zé)搜尋參數(shù)與異常類(lèi)型相匹配的第一個(gè)處理程序。然后進(jìn)入catch子句執(zhí)行,此時(shí)認(rèn)為異常得到了處理。

注意,只有匹配的catch子句才能得到執(zhí)行,這與switch語(yǔ)句不同。

3)棧軌跡

printStackTrace()方法所提供的信息可以通過(guò)getStackTrace()方法來(lái)直接訪問(wèn),這個(gè)方法將返回一個(gè)由棧軌跡中的元素所構(gòu)成的數(shù)組,其中每一個(gè)元素都表示

棧中的一幀。元素0是棧頂元素,并且是調(diào)用序列中的最后一個(gè)方法調(diào)用。數(shù)組中最后一個(gè)元素和棧底是調(diào)用序列中的第一個(gè)方法調(diào)用。

public class WhoCalled { static void f() { try { throw new Exception(); } catch (Exception e) { for(StackTraceElement ste : e.getStackTrace()) { System.out.println('line: ' + ste.getLineNumber() + ' method: ' + ste.getMethodName()); } } } static void g() {f();} static void h() {g();} public static void main(String[] args) {f();g();h();} }

程序輸出:

line: 5 method: fline: 14 method: mainline: 5 method: fline: 12 method: gline: 14 method: mainline: 5 method: fline: 12 method: gline: 13 method: hline: 14 method: main

三、Java標(biāo)準(zhǔn)異常

Throwable這個(gè)Java類(lèi)被用來(lái)表示任何可以作為異常被拋出的類(lèi)。

Throwable對(duì)象可分為兩種類(lèi)型:

1 Error用來(lái)表示編譯時(shí)和系統(tǒng)錯(cuò)誤。

2 Exception是可以被拋出的基本類(lèi)型,程序員關(guān)心的基類(lèi)型通常是Exception。

四、RuntimeException

if(t == null) { throw new NullPointerException(); }

如果對(duì)Null引用進(jìn)行調(diào)用,Java會(huì)自動(dòng)拋出NullPointerException異常,所以上述代碼是多余的,它屬于Java的標(biāo)準(zhǔn)運(yùn)行時(shí)檢測(cè)的一部分:

public class NeverCaught { static void f() { throw new RuntimeException(); } static void g() {f();} public static void main(String[] args) { g(); } }

輸出:

Exception in thread 'main' java.lang.RuntimeException

at Exception.NeverCaught.f(NeverCaught.java:6)

at Exception.NeverCaught.g(NeverCaught.java:10)

at Exception.NeverCaught.main(NeverCaught.java:14)

從輸出可以發(fā)現(xiàn),RuntimeException是一個(gè)特例,對(duì)于這種異常類(lèi)型,編譯器不需要異常說(shuō)明,其輸出被報(bào)告給了System.err。

如果RuntimeException沒(méi)有被捕獲而直達(dá)main(),那么在程序退出前將調(diào)用異常的printStackTrace()方法。

*注意:

只能在代碼中忽略RuntimeException(及其子類(lèi))類(lèi)型的異常,其它異常類(lèi)型的處理都是由編譯器強(qiáng)制實(shí)施的。

1)常見(jiàn)的五種RuntimeException

NullPointerException - 空指針引用異常

ClassCastException - 類(lèi)型強(qiáng)制轉(zhuǎn)換異常

IllegalArgumentException - 傳遞非法參數(shù)異常

ArithmeticException - 算術(shù)運(yùn)算異常

ArrayStoreException - 向數(shù)組中存放與聲明類(lèi)型不兼容對(duì)象異常

IndexOutOfBoundsException - 下標(biāo)越界異常

NegativeArraySizeException - 創(chuàng)建一個(gè)大小為負(fù)數(shù)的數(shù)組錯(cuò)誤異常

NumberFormatException - 數(shù)字格式異常

SecurityException - 安全異常

UnsupportedOperationException - 不支持的操作異常

五、使用finally進(jìn)行清理

class ThreeException extends Exception {} public class FinallyWorks { static int count = 0; public static void main(String[] args) { while(true) { try { if(count++ == 0) { throw new ThreeException(); } System.out.println('No exception'); } catch (ThreeException e) { System.out.println('ThreeException'); } finally { System.out.println('In finally clause'); if(count == 2) break; } } } }

這個(gè)程序給了我們一些思路(確實(shí)。。),如果把try塊放在循環(huán)里,就建立了一個(gè)“程序繼續(xù)執(zhí)行之前必須要到達(dá)”的條件。

還可以加入一個(gè)static類(lèi)型的計(jì)數(shù)器或者別的裝置,使循環(huán)在放棄之前能夠嘗試一定的次數(shù)。這將使程序的健壯性更上一個(gè)臺(tái)階(好叼的樣子)。

1)finally用來(lái)做什么

當(dāng)要把除內(nèi)存之外的資源恢復(fù)到它們的初始狀態(tài)時(shí),就要用到finally子句。

2)在return中使用finally

因?yàn)閒inally子句總是會(huì)執(zhí)行的,所以在一個(gè)方法中,可以從多個(gè)點(diǎn)返回,并且可以保證重要的清理工作仍舊會(huì)執(zhí)行:

class ThreeException extends Exception {} public class FinallyWorks { static int count = 0; public static void main(String[] args) { while(true) { try { if(count++ == 0) { throw new ThreeException(); } System.out.println('No exception'); return; } catch (ThreeException e) { System.out.println('ThreeException'); } finally { System.out.println('In finally clause'); if(count == 3) break; } } } }

第一次循環(huán),首先執(zhí)行第7行,符合條件,拋出異常,執(zhí)行catch塊,最后執(zhí)行finally清理,不符合第16行判斷,繼續(xù)循環(huán)

第二次循環(huán),不符合第7行判斷,拋出異常,并return,但依舊執(zhí)行finally清理,不符合第16行判斷,但try塊中已經(jīng)執(zhí)行return,所以程序結(jié)束,輸出:

ThreeExceptionIn finally clauseNo exceptionIn finally clause

3)Java異常的缺憾:異常丟失

public class ExceptionSilencer { public static void main(String[] args) { try { throw new RuntimeException(); } finally { return; } } }

以上就是JAVA基礎(chǔ)--如何通過(guò)異常處理錯(cuò)誤的詳細(xì)內(nèi)容,更多關(guān)于JAVA 通過(guò)異常處理錯(cuò)誤的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 张北县| 蒲江县| 古田县| 乌什县| 泸定县| 二手房| 乾安县| 邵武市| 任丘市| 牟定县| 泸溪县| 桐庐县| 和政县| 榆林市| 高青县| 鄯善县| 蓬莱市| 奉节县| 若尔盖县| 彝良县| 高青县| 平顶山市| 鲁甸县| 炎陵县| 宜宾县| 兖州市| 兴文县| 泗阳县| 若羌县| 德江县| 济阳县| 凤阳县| 漾濞| 泸西县| 齐齐哈尔市| 阿拉善右旗| 伊金霍洛旗| 临沧市| 肃南| 渭南市| 怀安县|