日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

java catch getm_Java------异常处理机制

發(fā)布時(shí)間:2024/10/14 106 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java catch getm_Java------异常处理机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、什么是異常處理

異常處理從字面的意思來(lái)講就是一種發(fā)生在 java 程序中的錯(cuò)誤并對(duì)其處理,但對(duì)程序員而言,異常的處理不單單的簡(jiǎn)單去處理異常,就 ok 了,還有眾多的概念和使用異常的方式方法需要掌握

異常在 java 中分有三種:

1、編譯時(shí)異常(受檢異常)------> 這種異常發(fā)生的概率很高;

2、運(yùn)行時(shí)異常 ------> 這種異常發(fā)生的概率較低,發(fā)生時(shí)直接退出 JVM;

3、錯(cuò)誤(error)-----> 錯(cuò)誤和異常是不同,錯(cuò)誤其實(shí)是脫離了程序員控制的問(wèn)題,錯(cuò)誤在代碼中經(jīng)常被忽略。比如內(nèi)存溢出,在編譯過(guò)程也是發(fā)現(xiàn)不了的;

如上圖可以看出受檢異常與運(yùn)行時(shí)異常都繼承于 Exception 類, 而?Exception 與 Error 繼承 Throwable 類,最終它們的父類都是 Object;

二、處理異常的方式有哪些

處理異常的方式有兩種:

1、throws :在需要進(jìn)行異常處理的方法體上加上 ,該方法體的異常將不會(huì)被本方法進(jìn)行處理,如果誰(shuí)調(diào)用該方法,則調(diào)用該方法的同時(shí)將異常一起調(diào)用。當(dāng)然調(diào)用該方法的調(diào)用者可以進(jìn)行處理該異常,也可以同樣使用拋出異常。

這樣的操作其實(shí)只是將異常交給了其他的程序處理,如果其他程序沒(méi)有能力進(jìn)行處理,則將一直進(jìn)行拋出,直到遇見一個(gè)能夠處理該異常的程序,并終止異常(該如何處理該異常呢?);

通過(guò)一個(gè)程序來(lái)更深次的了解 throws 如何處理異常:

1 1 importjava.io.FileInputStream;2 2 importjava.io.FileNotFoundException;3 3

4 4 /**

5 5 * throws 的深層次理解6 6*/

7 7 public classTest17 {8 8

9 9 //public static void main(String[] args) throws FileNotFoundException{//當(dāng)然這里也可以直接使用父類 Exception

10 10

11 11 public static void main(String[] args) throwsException{12 12

13 13 System.out.println("我是入口");14 14

15 15m1();16 16}17 17

18 18 public static void m1() throwsFileNotFoundException{19 19 //從m1 - m3 的調(diào)用可以看出 throws 處理機(jī)制是不對(duì)異常處理,只是拋出異常,誰(shuí)調(diào)用該異常,誰(shuí)處理,最終會(huì)流向哪里處理呢?

20 20

21 21 System.out.println("m1...start!");22 22 m2(); //m1() 也同樣出現(xiàn)了異常

23 23 System.out.println("m1...end!");24 24}25 25

26 26 public static void m2() throwsFileNotFoundException{27 27 //28 28

29 29 System.out.println("m2...start!");30 30 m3(); //從這個(gè)地方我們就可以看出了當(dāng) m2()進(jìn)行調(diào)用 m3()時(shí),m2() 方法體也出現(xiàn)需要處理的異常

31 31 //同樣的可以依照 m3() 方法進(jìn)行處理

32 32

33 33 System.out.println("m2...end!");34 34}35 35

36 36 //public static void m3() throws NullPointerException{

37 37 //已經(jīng)對(duì)該方法體進(jìn)行了拋出異常的設(shè)置,為什么是無(wú)效的?

38 38 //NullPointerException 因?yàn)檫@個(gè)是一個(gè)空指針的異常,它不對(duì) IO 流的異常進(jìn)行處理

39 39

40 40 public static void m3() throwsFileNotFoundException {41 41 //FileNotFoundException 異常機(jī)制對(duì) m3 起到了效果,主要因?yàn)?FileNotFoundException 繼承 IOException;

42 42

43 43 FileInputStream fis = new FileInputStream("E:\\jaa 作業(yè)室\\temp.java");44 44 //FileInputStream 是一個(gè)繼承了異常基本類的 IO 流; 所以同樣在使用它的時(shí)候程序員就需要對(duì)它進(jìn)行處理

45 45

46 46 System.out.println("m3...end!");47 47}48 48}49 49 /**看看如果讀取的路徑出現(xiàn)錯(cuò)誤會(huì)發(fā)生什么結(jié)果吧50 50 * 我是入口51 51 * m1...start!52 52 * m2...start!53 53 * // 這里也出現(xiàn)一了一件有意思的事情:54 54 * // 每個(gè)方法體中只有在 異常 前的值被輸出,緊跟異常之后的值直接不被讀取了55 55 * // 從中得出一個(gè)結(jié)論: 一個(gè)方法中通過(guò) throws 拋出的異常,在被調(diào)用時(shí),調(diào)用者與被調(diào)用本身,異常之后的代碼將被執(zhí)行中斷,不會(huì)輸出結(jié)果,異常前的值會(huì)進(jìn)行輸出56 56 *57 57 *58 58 * Exception in thread "main" java.io.FileNotFoundException: E:\jaa 作業(yè)室\temp.java (系統(tǒng)找不到指定的路徑。)59 59 * // 這里就是異常的處理結(jié)果了: Exception in thread "main" java.io.FileNotFoundException: E:\jaa 作業(yè)室\temp.java (系統(tǒng)找不到指定的路徑。)60 60 * // 是不是發(fā)現(xiàn)奇妙的事情:各個(gè)方法體不斷的對(duì)異常拋出,最后在 main 方法中進(jìn)行了異常處理,那為什么方法體中就不能處理,只能在 main 中處理呢?61 61 * // 其實(shí) main 方法是主調(diào)方法,是一切程序的入口,方法體只有被 main 調(diào)用才能輸出結(jié)果,(當(dāng)然后面還有一種方法可以在方法體中處理)而異常的處理其實(shí)62 62 * // 也不是在 main 方法中處理的,可以看到 main 方法體上也出現(xiàn)了拋出異常的設(shè)置, 其實(shí)在程序員不能看到的 JVM 中,程序?qū)惓W罱K交給了63 63 * // FileNotFoundException 類處理該異常。64 64 *65 65 *66 66 * at java.base/java.io.FileInputStream.open0(Native Method)67 67 * at java.base/java.io.FileInputStream.open(FileInputStream.java:213)68 68 * at java.base/java.io.FileInputStream.(FileInputStream.java:155)69 69 * at java.base/java.io.FileInputStream.(FileInputStream.java:110)70 70 *71 71 * at Rview.Test17.m3(Test17.java:43)72 72 * at Rview.Test17.m2(Test17.java:30)73 73 * at Rview.Test17.m1(Test17.java:22)74 74 * at Rview.Test17.main(Test17.java:15)75 75 * // 這里表示的是異常出現(xiàn)的行號(hào)索引76 76*/

Throws 深層次理解

2、try...catch... : 捕捉有可能發(fā)生異常的代碼,并將它處理,不會(huì)對(duì)異常拋出,只會(huì)終止異常的向后發(fā)展

通過(guò)一個(gè)程序來(lái)了解 try...catch... 如何處理異常:

1 1 importjava.io.FileInputStream;2 2 importjava.io.FileNotFoundException;3 3 importjava.io.FileOutputStream;4 4 importjava.io.IOException;5 5

6 6 /**

7 7 * try...catch... 的使用方法和重點(diǎn)8 8*/

9 9

10 10 //這是一個(gè)與 Test17 相同的程序,但我們需要對(duì)這個(gè)程序使用使用不同的異常處理機(jī)制

11 11

12 12 public classTest18 {13 13

14 14 public static voidmain(String[] args) {15 15

16 16m1();17 17}18 18

19 19 public static voidm1(){20 20

21 21 System.out.println("m1...start!");22 22m2();23 23 System.out.println("m1...end!");24 24}25 25

26 26 public static voidm2(){27 27

28 28 System.out.println("m2...start!");29 29m3();30 30 System.out.println("m2...end!");31 31}32 32

33 33

34 34

35 35 public static voidm3(){36 36

37 37

38 38 //try...catch... 的重點(diǎn): 可以在發(fā)生異常點(diǎn)進(jìn)行直接處理異常,當(dāng)其他調(diào)用者調(diào)用時(shí)將不會(huì)發(fā)現(xiàn)該方法曾經(jīng)有過(guò)異常的情況,同時(shí)也不會(huì)將異常感染

39 39 //給調(diào)用者,總之可以直接對(duì)異常直接處理

40 40

41 41 //try...catch...不僅僅只能對(duì)單個(gè)異常進(jìn)行捕捉處理,同時(shí)可以對(duì)多個(gè)不同類型的異常進(jìn)行處理

42 42 try{43 43 FileInputStream fis = new FileInputStream("E:\\java\\作業(yè)室\\temp.java");44 44 //try 中將可能發(fā)生異常的代碼段進(jìn)行捕捉

45 45 fis.close(); //再次出現(xiàn)了一個(gè)異常,再處理

46 46

47 47 //以上代碼出現(xiàn)異常,直接進(jìn)入 catch 分支,不對(duì)其后的代碼進(jìn)行編譯;

48 48 System.out.println("hello ");49 49}50 50 catch (FileNotFoundException e/*必須要加變量名*/) { /*將捕捉到的異常進(jìn)行處理*/

51 51

52 52 //e.printStackTrace();//顯示處理結(jié)果的方法

53 53

54 54 System.out.println("出現(xiàn)了異常,已經(jīng)處理!!");55 55

56 56 }catch(IOException e){57 57 //已經(jīng)進(jìn)行了異常處理,為什么出現(xiàn)了錯(cuò)誤?

58 58 //兩個(gè) catch 對(duì)不同的異常進(jìn)行了處理,但是,前一個(gè) catch 的異常處理類是最高類 Exception,而后一個(gè) catch 的異常處理類

59 59 //FileNotFoundException 是 Exception 的一個(gè)子類,所以在進(jìn)行多次的 catch 異常處理時(shí)注意子類與父類的位置關(guān)系

60 60 //(子類在前、父類在后 或者 同時(shí)是子類)

61 61e.printStackTrace();62 62}63 63 //同樣要進(jìn)行異常處理,這次我們將使用 try... catch... 的方式處理

64 64

65 65 System.out.println("m3...end!");66 66}67 67}68 68

69 69 /**output result:70 70 * m1...start!71 71 * m2...start!72 72 * m3...end!73 73 * // 奇妙的事情又發(fā)生了,使用 try... catch...的方式處理異常并不影響異常之后的代碼運(yùn)行74 74 *75 75 * m2...end!76 76 * m1...end!77 77 *78 78 *79 79 * java.io.FileNotFoundException: E:\java\作業(yè)室\temp.java (系統(tǒng)找不到指定的路徑。)80 80 * // 這個(gè)結(jié)果的輸出靠 printStackTrace() 方法;81 81 *82 82 * at java.base/java.io.FileInputStream.open0(Native Method)83 83 * at java.base/java.io.FileInputStream.open(FileInputStream.java:213)84 84 * at java.base/java.io.FileInputStream.(FileInputStream.java:155)85 85 * at java.base/java.io.FileInputStream.(FileInputStream.java:110)86 86 *87 87 *88 88 * at Rview.Test18.m3(Test18.java:42)89 89 * at Rview.Test18.m2(Test18.java:30)90 90 * at Rview.Test18.m1(Test18.java:23)91 91 * at Rview.Test18.main(Test18.java:17)92 92 * // 同樣是異常出現(xiàn)所在的行號(hào)索引93 93*/

try...catch 處理方式

三、getMessage() 和 printStackTrace()

這是兩個(gè)都是命令行打印異常信息在程序中出錯(cuò)的位置及原因,其兩者的區(qū)別在于:前者的簡(jiǎn)單的打印出錯(cuò)原因,后者是詳細(xì)的打印出錯(cuò)的位置及原因,一起用一段程序了解一下吧

1 1 importjava.io.FileInputStream;2 2 importjava.io.FileNotFoundException;3 3

4 4 public classTest19 {5 5

6 6 public static voidmain(String[] args) {7 7

8 8m2();9 9}10 10

11 11 public static voidm2 (){12 12m3();13 13}14 14

15 15 public static voidm3(){16 16 try{17 17 FileInputStream fis = new FileInputStream("E:\\自考本科學(xué)習(xí)筆記\\英語(yǔ)\\基礎(chǔ)英語(yǔ)語(yǔ)法、English.一般現(xiàn)在時(shí)態(tài).docx");18 18

19 19 }catch(FileNotFoundException e){20 20 //e.printStackTrace();

21 21 /*printStackTrace(); 方法的使用 將詳細(xì)的描述錯(cuò)誤的原因和錯(cuò)誤出現(xiàn)的位置22 22 java.io.FileNotFoundException: E:\自考本科學(xué)習(xí)筆記\英語(yǔ)\基礎(chǔ)英語(yǔ)語(yǔ)法、English.一般現(xiàn)在時(shí)態(tài).docx (系統(tǒng)找不到指定的文件。)23 23 at java.base/java.io.FileInputStream.open0(Native Method)24 24 at java.base/java.io.FileInputStream.open(FileInputStream.java:213)25 25 at java.base/java.io.FileInputStream.(FileInputStream.java:155)26 26 at java.base/java.io.FileInputStream.(FileInputStream.java:110)27 27 at Rview.Test19.m3(Test19.java:19)28 28 at Rview.Test19.m2(Test19.java:14)29 29 at Rview.Test19.main(Test19.java:10)*/

30 30

31 31 String st =e.getMessage();32 32System.out.println(st);33 33 /*getMessage() 方法的使用,會(huì)簡(jiǎn)單的描述錯(cuò)誤的原因34 34 E:\自考本科學(xué)習(xí)筆記\英語(yǔ)\基礎(chǔ)英語(yǔ)語(yǔ)法、English.一般現(xiàn)在時(shí)態(tài).docx (系統(tǒng)找不到指定的文件。)35 35*/

36 36

37 37 //System.out.println(e.getMessage()); 另一種寫法

38 38}39 39}40 40 }

getMessage 與 printStackTrace 使用

四、finally的使用

finally 關(guān)鍵字的使用: finally 是在catch之后添加使用,它的作用是無(wú)論 try...catch...是否執(zhí)行,它一定會(huì)執(zhí)行

1 1 importjava.io.FileInputStream;2 2 importjava.io.FileNotFoundException;3 3 importjava.io.IOException;4 4

5 5 /*finally 通常在什么情況下使用6 6 通常在流關(guān)閉的情況下使用,這樣可以保證關(guān)閉可以一定執(zhí)行7 7*/

8 8

9 9 public classTest20 {10 10

11 11 public static voidmain(String[] args) {12 12 FileInputStream fis = null;13 13 try{14 14 fis = new FileInputStream("E:\\自考本科學(xué)習(xí)筆記\\英語(yǔ)\\基礎(chǔ)英語(yǔ)語(yǔ)法\\English.句子成分.docx");15 15

16 16 System.out.println("HelloWord!");17 17 String s = null;18 18s.toString();19 19

20 20 }catch(FileNotFoundException e) {21 21e.printStackTrace();22 22 } finally{23 23 try{24 24 if (null !=fis){25 25fis.close();26 26}27 27 }catch(IOException e){28 28e.printStackTrace();29 29}30 30}31 31}32 32 }

finally的使用

finally的面試題:

1 1 importjava.io.IOException;2 2

3 3 public classTest21 {4 4

5 5 public static voidmain(String[] args) {6 6 int result =m();7 7System.out.println(result);8 8 //output result: 100

9 9 /**為什么出現(xiàn)這種情況? finally 難道沒(méi)有執(zhí)行嗎?10 10 *11 11 * java程序有兩個(gè)亙古不變的原則: 1、 方法體中代碼必須遵循自上而下順序依次執(zhí)行12 12 * 2、 return 語(yǔ)句一旦執(zhí)行,整個(gè)方法必須結(jié)束13 13 *14 14 **/

15 15}16 16

17 17 public static intm(){18 18 int i = 100;19 19 try{20 20 returni;21 21 } finally{22 22 i++;23 23}24 24

25 25 /**

26 26 * 所以 該方法的底層程序執(zhí)行的是這樣的程序27 27 * public static int m(){28 28 * int i = 100;29 29 * int j = i;30 30 * i ++;31 31 * return j;32 32 * }33 33 **/

34 34}35 35 }

finally 的面試題

細(xì)談 final、 finally、 finalize的區(qū)別

fiinal:?修飾符(關(guān)鍵字) 如果一個(gè)類被聲明為final,意味著它不能再派生新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為abstract,又被聲明為final的。將變量或方法聲明為final,可以保證他們使用中不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而以后的引用中只能讀取,不可修改,被聲明為final的方法也同樣只能使用,不能重載。與 static? 連用將變量變?yōu)槌A?#xff1b;

finally:在異常處理時(shí)提供 finally 塊來(lái)執(zhí)行清楚操作。如果拋出一個(gè)異常,那么相匹配的 catch 語(yǔ)句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入finally塊;

finalize:是方法名。java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除之前做必要的清理工作。這個(gè)方法是在垃圾收集器在確定了被清理對(duì)象沒(méi)有被引用的情況下調(diào)用的。finalize 是在Object 類中定義的,因此,所有的類都繼承了它。子類可以覆蓋 finalize() 方法,來(lái)整理系統(tǒng)資源或者執(zhí)行其他清理工作。

四、運(yùn)行時(shí)異常什么時(shí)候出現(xiàn)

程序在編譯階段是正常執(zhí)行的,且沒(méi)有任何的錯(cuò)誤,但是當(dāng)運(yùn)行時(shí),就立馬出現(xiàn)了錯(cuò)誤,并退出 JVM 這種情況在什么時(shí)候發(fā)生呢?

110 / 0 ---------> 這個(gè)就是一個(gè)很經(jīng)典的運(yùn)行時(shí)異常

總結(jié)

以上是生活随笔為你收集整理的java catch getm_Java------异常处理机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。