java 编写异常_Java基础编程之异常处理
Java異常類是對于程序中可能出現(xiàn)的錯誤或者異常的一種處理方式。在設(shè)計程序的過程中,對于可能出現(xiàn)的異常錯誤,比如說用戶輸入錯誤,設(shè)備錯誤,磁盤滿了或者代碼錯誤等等,通常采用異常處理的方式來進行處理可能的錯誤。 JAVA的異常處理機制:如果某個方法不能按照正常的途徑完成任務(wù),就可以通過另一種路徑退出該方法,并處理可能出現(xiàn)的錯誤。在這種情況下會拋出一個封裝了錯誤信息的對象。 這個方法會立刻退出同時不返回任何值。另外,調(diào)用這個方法的其他代碼也無法繼續(xù)執(zhí)行,異常處理機制會將代碼執(zhí)行交給異常處理器。
(一)Java異常
異常:導致程序中斷運行的一種指令流。 在理想的情況下,程序完全按照我們設(shè)計的流程來執(zhí)行,但是很多時候會出現(xiàn)這樣或者那樣的錯誤,如文件找不到,磁盤滿了或者代碼錯誤等,這些錯誤會影響程序的正常執(zhí)行,對于這種情況,就有了異常處理情況,即使程序異常了,它也是按照某種邏輯在執(zhí)行,只是沒有按照我們給它安排的邏輯執(zhí)行。異常在Java中定義為Throwable類,其結(jié)構(gòu)層次圖如下:
由上圖可以看出,Thowable有兩個重要的子類,一個是Error類,另一個是Expection類,每一個子類下面還有很多小的分類。
Error類指的是Java運行時系統(tǒng)的內(nèi)部錯誤或者資源耗盡錯誤, 這是程序無法處理的錯誤,表示運行應用程序中較嚴重問題,對于這類問題,JVM告知用戶,并盡力終止程序。
Expection類指的是 程序本身可以處理的異常。主要分為兩類,RuntimeException類異常或者其他異常,由程序錯誤導致的異常稱之為RuntimeExpection,比如說:錯誤的類型轉(zhuǎn)化,數(shù)組訪問過界,訪問空指針等。而程序本身沒有錯誤,像I/O錯誤這類問題所導致的異常稱之為其他異常,比如說試圖打開一個不存在的文件或類。
Java 異常類的另一種分類方式是:可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。
可查的異常(checked exceptions):正確的程序在運行時,出現(xiàn)情理可容的異常,除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。對于此類異常,要么用try-catch語句捕獲它,要么用throws子句聲明拋出它,否則編譯不會通過。
可不查的異常(unchecked exceptions): 包括RuntimeException及其子類和Error。 編譯器不要求強制處理的異常。
(二) 異常處理
在 Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。
拋出異常:在執(zhí)行一個方法時,如果發(fā)生異常,則這個方法生成代表該異常的一個對象,并停止當前執(zhí)行路徑,并將此異常提交給系統(tǒng)。首先像創(chuàng)建普通的java對象一樣,使用new在堆上創(chuàng)建一個異常對象;然后,當前的執(zhí)行路徑被終止,并且從當前環(huán)境中彈出對異常對象的引用。此時,異常處理機制接管程序,并開始尋找一個恰當?shù)牡胤嚼^續(xù)執(zhí)行程序,這個恰當?shù)牡胤骄褪钱惓L幚沓绦蚧蛘弋惓L幚砥?#xff0c;它的任務(wù)是將程序從錯誤狀態(tài)中恢復,以使程序要么換一種方式運行,要么繼續(xù)運行下去。
捕捉異常:當系統(tǒng)捕捉到該異常后,尋求相應的代碼來看處理該異常,在方法的調(diào)用棧中查找合適·的異常處理器,從生成異常的方法開始回溯,直到找到相應的異常處理代碼,并在控制臺上打印異常信息,包括異常的信息的堆棧的內(nèi)容。
Java異常處理涉及到五個關(guān)鍵字,分別是:try、catch、finally、throw、throws。
處理方法1 捕捉異常:try-catch-finally語句
try -catch-finally語句是常用的異常處理語句,其結(jié)構(gòu)如下:
try {
code1;
// 可能會發(fā)生異常的程序代碼
} catch (Type1 id1) {
code2
// 捕獲并處理try拋出的異常類型Type1
} catch (Type2 id2) {
code3
// 捕獲并處理try拋出的異常類型Type2
} finally {
code4
// 無論是否發(fā)生異常,都將執(zhí)行的語句塊
}1
2
3
4
5
6
7
8
9
10
11
12
13
其邏輯框圖如下:
try: 制定一段代碼,即一次性捕獲并處理的范圍,用于監(jiān)聽。將要被監(jiān)聽的代碼(可能拋出異常的代碼)放在try語句塊之內(nèi),當try語句塊內(nèi)發(fā)生異常時,(1)程序?qū)⑻鰐ry語句塊中的其余代碼,(2)轉(zhuǎn)而執(zhí)行catch中的處理器代碼,異常就被拋出 。
注:當異常代碼執(zhí)行完成以后,try語句塊中尚未執(zhí)行的語句不會再執(zhí)行。
一個try語句必須有至少一個catch或finally語句。
catch用于處理不同類型的異常。捕獲順序為:越是底層的類,越放在下面。常見的方法有:
toString():顯示異常的類名和產(chǎn)生的原因。
geyMessage( ) : 顯示異常的原因。
printstackTrack() :顯示異常發(fā)生時堆棧的內(nèi)容。
finally:不管異常處理與否,必須要執(zhí)行的代碼塊。比如說關(guān)閉外界的資源。
當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會被執(zhí)行:
1)在finally語句塊中發(fā)生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關(guān)閉CPU。
異常執(zhí)行圖示:
代碼示例:
public class TestException
{
public static void main(String args[])
{ int i = 0;
String greetings[] = { " Hello world !", " Hello World !! ", " HELLO WORLD !!!" };
while (i < 4) {
try { // 特別注意循環(huán)控制變量i的設(shè)計,避免造成無限循環(huán)
System.out.println(greetings[i++]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("數(shù)組下標越界異常");
} finally
{
System.out.println("--------------------------");
}
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
處理方法2 拋出異常 Throws、Throw 用法
如果遇到無法處理的情況,Java便會拋出一個異常,即告訴編譯器需要返回什么值,以及可能出現(xiàn)哪些錯誤。
public void test() throws FileNotFoundException {
method();
}
public void method() throws FileNotFoundException {
//一個會拋出異常的方法
method2();
}
//這里 方法后是throws
public void method2() throws FileNotFoundException {
//這里是throw
throw new FileNotFoundException();
}
Throw總是出現(xiàn)在函數(shù)體中, 表示手動拋出一個異常,拋出異常的時候,直接在 Throw 后面添加異常的實例即可。 用來拋出一個Throwable類型的異常。程序會在throw語句后立即終止,它后面的語句執(zhí)行不到,然后在包含它的所有try塊中(可能在上層調(diào)用函數(shù)中)從里向外尋找含有與其匹配的catch子句的try塊。
public class Test {
public static void main(String[] args) {
try {
throw new TestException20180809("自定義異常:天王蓋地虎");
} catch (Exception e) {
e.printStackTrace();
}
}
}1
2
3
4
5
6
7
8
9
10
11
Throws 聲明過的方法表示此方法不處理異常,找到一個合適的異常類,創(chuàng)建這個類的對象,并將對象拋出。
import java.lang.Exception;
public class TestException {
static void pop() throws NegativeArraySizeException {
// 定義方法并拋出NegativeArraySizeException異常
int[] arr = new int[-3]; // 創(chuàng)建數(shù)組
}
public static void main(String[] args) { // 主方法
try { // try語句處理異常信息
pop(); // 調(diào)用pop()方法
} catch (NegativeArraySizeException e) {
System.out.println("pop()方法拋出的異常");// 輸出異常信息
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
自定義異常類:在程序中,如果標準異常類并不能夠充分的描述問題,則需要自己來定義一個異常類來解決問題,只需繼承 Exception 即可。可以通過以下步驟定義異常類(1)創(chuàng)建自定義異常類。(2)在方法中通過throw關(guān)鍵字拋出異常對象。(3)如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲并處理;否則在方法的聲明處通過throws關(guān)鍵字指明要拋出給方法調(diào)用者的異常,繼續(xù)進行下一步操作。(4)在出現(xiàn)異常方法的調(diào)用者中捕獲并處理異常。
import java.lang.Exception;
public class TestException {
static int quotient(int x, int y) throws MyException { // 定義方法拋出異常
if (y < 0) { // 判斷參數(shù)是否小于0
throw new MyException("除數(shù)不能是負數(shù)"); // 異常信息
}
return x/y; // 返回值
}
public static void main(String args[]) { // 主方法
int a =3;
int b =0;
try { // try語句包含可能發(fā)生異常的語句
int result = quotient(a, b); // 調(diào)用方法quotient()
} catch (MyException e) { // 處理自定義異常
System.out.println(e.getMessage()); // 輸出異常信息
} catch (ArithmeticException e) { // 處理ArithmeticException異常
System.out.println("除數(shù)不能為0"); // 輸出提示信息
} catch (Exception e) { // 處理其他異常
System.out.println("程序發(fā)生了其他的異常"); // 輸出提示信息
}
}
}
class MyException extends Exception { // **創(chuàng)建自定義異常類**
String message; // 定義String類型變量
public MyException(String ErrorMessagr) { // 父類方法
message = ErrorMessagr;
}
public String getMessage() { // 覆蓋getMessage()方法
return message;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(三)Java常見異常
五種常見的運行時異常:
ClassCastException(類轉(zhuǎn)換異常)
IndexOutOfBoundsException(數(shù)組越界)
NullPointerException(空指針)
ArrayStoreException(數(shù)據(jù)存儲異常,操作數(shù)組時類型不一致)
IO操作的BufferOverflowException異常
非運行時異常必須得捕獲,否則編譯不過去,java編譯器要求程序員必須對這種異常進行catch,Java認為Checked異常都是可以被處理(修復)的異常,所以Java程序必須顯式處理Checked異常。常見的非運行異常有io異常和sql異常。
IOException、FileNotFoundExcetion 和SQLException
(四)當異常遇到return
在一個方法中,無論 Try 塊中有沒有異常、Return,只要 Finally 塊中有 Return,那么函數(shù)的返回值都由 Finally 塊提供。
Java異常總結(jié):(1)一個圖:異常類型圖。(2)五個關(guān)鍵字,try, catch finally throws throw
(3)繼承關(guān)系:先大后小,(4)異常和重寫:子類重寫異常范圍不能超出父類。
實例說明:
public class TestException {
public TestException() {
}
boolean testEx() throws Exception {
boolean ret = true;
try {
ret = testEx1();
} catch (Exception e) {
System.out.println("testEx, catch exception");
ret = false;
throw e;
} finally {
System.out.println("testEx, finally; return value=" + ret);
return ret;
}
}
boolean testEx1() throws Exception {
boolean ret = true;
try {
ret = testEx2();
if (!ret) {
return false;
}
System.out.println("testEx1, at the end of try");
return ret;
} catch (Exception e) {
System.out.println("testEx1, catch exception");
ret = false;
throw e;
} finally {
System.out.println("testEx1, finally; return value=" + ret);
return ret;
}
}
boolean testEx2() throws Exception {
boolean ret = true;
try {
int b = 12;
int c;
for (int i = 2; i >= -2; i--) {
c = b / i;
System.out.println("i=" + i);
}
return true;
} catch (Exception e) {
System.out.println("testEx2, catch exception");
ret = false;
throw e;
} finally {
System.out.println("testEx2, finally; return value=" + ret);
return ret;
}
}
public static void main(String[] args) {
TestException testException1 = new TestException();
try {
testException1.testEx();
} catch (Exception e) {
e.printStackTrace();
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
運行結(jié)果:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, finally; return value=false
testEx, finally; return value=false
常見的異常·:
JAVA異常知識結(jié)構(gòu)
總結(jié)
以上是生活随笔為你收集整理的java 编写异常_Java基础编程之异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql8.0怎么导入数据_MySQL
- 下一篇: 电蚊香片和传统蚊香哪一种驱蚊效果好?