激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 異常詳解

Java 異常詳解

2020-08-04 14:43雨點的名字 Java教程

本文主要介紹了異常與錯誤的區別,異常的體現分類,異常的處理機制,如何自定義異常等,具有很好的參考價值,下面跟著小編一起來看下吧

一.異常與錯誤的區別

  再講異常之前我們就應該要知道異常和錯誤的區別

  Error類和Exception類的父類都是throwable類,他們的區別是:

  Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對于這類錯誤的導致的應用程序中斷,

僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。

  Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常。

二.異常的體現分類:

  1.checked 異常檢查期異常 java.lang.Excetion 在編譯期需要人工處理否則編譯失?。篍xception的子類除了運行期異常都是檢查期異常

  2.非Checked異常運行時異常 java.lang.RuntimeException 不需要處理的直接能編譯通過:所有的RuntimeException以及其子類都是運行異常

Java 異常詳解

舉例:運行期異常

Java 異常詳解

結果:運行期異常,當你敲好代碼時不會報錯,而當你運行時才會報除數不能為0的錯誤

舉例:檢查期異常:

Java 異常詳解

結果:檢查期異常,當你編譯的時候就會報錯,一定要拋出異常編譯才能通過

三.異常的處理機制

Java語言主要依賴于 try  catch  finally  和throws  throw  五個關鍵字來描述異常

 1) 在發生異常的地方直接處理

  使用try catch finally  直接處理異常

  a)  try-catch-finally結構中try塊是必須有的,catch和finally塊為可選,但兩者至少必須出現其中之一。

  b) catch  可以同時出現多個,但一個異常最多捕獲一個catch,而且catch的順序是從上往下

  c) finally  無論是否捕獲異常都會執行的一行代碼

演示1:try異常

?
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
public class TestException {
 public static void main(String[] args) {
  int c = 0;
  try
  {
   int a = 3;
   int b = 0;
   // 這塊代碼出現了異常
   c = a / b;
   // 那么異常之后的代碼都不會被執行
   System.out.println("Hello World");
  }
  catch (ArithmeticException e)
  {
   System.out.println("除數不能為零");
  }
  finally
  {
   //不管有沒有發生異常,finally語句塊都會被執行
   System.out.println("Welcome");
  }
  System.out.println(c);
  // 當b為0時,有異常,輸出為c的初始值0
 }
 }
 //輸出結果:除數不能為零 Welcome 0
 
try異常

演示2:帶有return的異常

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class DemoException {
 public static void main(String[] args) {
 int a=test3();
 System.out.println(a);
 }
 @SuppressWarnings("finally")
 public static int test3(){
 try {
  System.out.println(9 / 0);
  return 1;
 } catch (Exception e) {
  System.out.println("捕獲到了異常....");
  return 2;
 }finally{
  System.out.println("無論如何都會執行的代碼...");
  return 3;
 }
 }
}
//輸出結果 "呵呵""哈哈" 3
 
帶有return異常

得出結論:作用范圍   return  終止整個方法體,但在finally出現之前  return是老大  finally 作用范圍> return

2)將異常拋給調用者讓調用者處理

?
1
2
3
4
5
//throws在方法體頭部通過聲明 拋出異常...
public void dealFile() throws FileNotFoundException{
 FileInputStream fis =new FileInputStream("C:/name.txt");
}
//那么那么上面調用這個方法可以選擇是繼續拋出,還是捕獲異常

案例一:通過throws拋出異常,調用者直接捕獲拋出的異常

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestException {
 public static void main(String[] args) {
   try {
   Test3(); //這里選擇直接捕獲異常,而不是在拋出異常
   } catch (NumberFormatException e) {
   System.err.println("非數據類型不能轉換。");
  } //System.err.println();這種輸出方式可以輸出錯誤的消息,在控制臺呈現紅色。
  }
  public static void Test3() throws NumberFormatException{
   String s = "abc";
  System.out.println(Double.parseDouble(s));
  }
 }
 
throws異常

運行結果:

非數據類型不能轉換。

注意:使用Throws是的限制

兩小原則

 使用throws 聲明拋出異常一個限制

 子類繼承父類重寫父類的方法

 子類拋出的異常必須比父類少

 子類拋出的異常必須比父類小

 兩小原則是針對檢查期異常的,運行期異常不遵循這個規則(RuntimeException 以及子類)

案例二:通過throw拋出異常

?
1
2
3
4
5
6
7
8
9
10
11
12
public class TestException {
 public static void main(String[] args) {
  String s = "abc";
  if(s.equals("abc")) {
   throw new NumberFormatException("不能相等");
   } else {
   System.out.println(s);
  }
  }
 }
 
throw異常

運行結果如下:

Java 異常詳解

面試題:Throw 和Throws有什么區別?

 Throw語句是用在方法體內表示拋出的異常由方法體內的語句處理

 Throws  語句是在方法聲明之后拋出異常表示在拋出的異常交給調用者處理

 Throws 要么使用try –catch –finally 處理要么繼續拋出

四.自定義異常

所謂自定義異常,通常就是定義一個類,去繼承Exception類或者它的子類。因為異常必須直接或者間接地繼承自Exception類。

通常情況下,會直接繼承自Exception類,一般不會繼承某個運行時的異常類。

自定義異常可以用于處理用戶登錄錯誤,用戶輸入錯誤提示等。

自定義異常需要遵循以下步驟

  • 繼承RuntimeExcetion  或者Exception
  • 寫一個無參的構造函數
  • 寫一個String類型的構造函數

舉例:自定義異常:

?
1
2
3
4
5
6
7
8
9
10
11
public class MyException extends Exception
{
 public MyException()
 {
 super();
 }
 public MyException(String message)
 {
 super(message);
 }
}

一種處理異常方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ExceptionTest4
{
 public void method(String str) throws MyException
 {
 if(null == str)
 {
  throw new MyException("傳入的字符串參數不能為null!");
 }
 else
 {
  System.out.println(str);
 }
 }
 public static void main(String[] args) throws MyException //異常處理方式1,不斷向外拋出
 {
 ExceptionTest4 test = new ExceptionTest4();
 test.method(null);
 }
}

另一種異常處理方式:

?
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
public class ExceptionTest4
{
 public void method(String str) throws MyException
 {
 if (null == str)
 {
  throw new MyException("傳入的字符串參數不能為null!");
 }
 else
 {
  System.out.println(str);
 }
 }
 public static void main(String[] args)
 {
 //異常處理方式2,采用try...catch語句
 try
 {
  ExceptionTest4 test = new ExceptionTest4();
  test.method(null);
 }
 catch (MyException e)
 {
  e.printStackTrace();
 }
 finally
 {
  System.out.println("程序處理完畢");
 }
 }
}

最后說一句,try-catch-finally雖好用,但是如果是濫用,這樣只是會讓程序的可讀性變的很糟糕,當程序報錯,就無法快速準確的定位了。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/qdhxhz/p/6372037.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一级在线 | 午夜精品久久久久久中宇 | 久久91精品久久久久清纯 | 天天躁狠狠躁夜躁2020挡不住 | 亚洲国产精品一区二区久久 | 亚洲午夜视频 | 美女黄网站免费观看 | 国产精品剧情一区二区三区 | 羞羞的视频在线 | av在线日韩 | 高清国产免费 | 国产精品久久久久影院老司 | 免费毛片a线观看 | 久久免费视频一区 | 黄色毛片观看 | 国产亚洲精品久久久久久大师 | 欧美极品欧美精品欧美视频 | 久久免费观看一级毛片 | 羞羞视频免费入口网站 | 免费在线国产精品 | 成人宗合网 | 国产亚洲精品久久久久5区 综合激情网 | 久久久久国产视频 | 亚洲一区二区三区在线 | 国产高清一区 | 毛片免费看网站 | 看国产一级毛片 | 国产精品久久久久久久久久电影 | 欧美日韩高清一区二区三区 | 999久久国产 | 91精品久久香蕉国产线看观看 | 日韩视频在线不卡 | 在线观看网址av | 在线a视频 | 羞羞视频免费网站日本动漫 | 日韩视频一 | 在线免费观看日韩视频 | 久久精品中文字幕一区二区三区 | 美女在线视频一区二区 | 久久成人国产精品 | 日本a∨精品中文字幕在线 欧美1—12sexvideos |