Java 基礎篇之異常
異常
異常層次
- Error:Java 執行時系統的內部錯誤和資源耗盡錯誤。應用程式不應該丟擲這種型別的物件。如果出現了這樣的內部錯誤,除了通告給使用者,並盡力使程式安全地終止之外,再也無能為力了。
- Exception
- RuntimeException:由程式錯誤導致的異常
- 其他異常:程式本身沒有問題,但由類似 IO 錯誤導致的異常
Checked 異常 & Runtime 異常
Checked 異常:不是 RuntimeException 類及其子類的異常例項
Runtime 異常:所有 RuntimeException 類及其子類的異常例項
Java 認為 Checked 異常都是可以被處理修復的異常,所以程式必須顯示處理 Checked 異常,如果程式沒有處理 Checked 異常,編譯時會出錯。Checked 異常體現了 Java 的設計理念,沒有完善錯誤處理的程式碼根本不會被執行。
對 Checked 異常處理方式:
當前方法明確知道如何處理該異常,應該使用 try-catch 處理該異常
當前方法不知道如何處理該異常,應在定義該方法時宣告丟擲該異常
對 Runtime 異常的處理方式:
- Runtime 異常無需顯式宣告丟擲,如果程式需要捕獲 Runtime 異常,也可以使用 try-catch 塊
throws 宣告丟擲異常
如果當前方法不知道如何處理這種型別的異常,該異常應該由上一級呼叫者處理,如果上一級呼叫者也不知道如何處理,再丟擲直至交由 JVM 處理。
throws 宣告丟擲只能在方法宣告中使用,可以宣告丟擲多個異常類。一旦使用 throws 語句宣告丟擲該異常,程式就無需使用 try-catch 來捕獲異常了。
示例:下面程式宣告不處理 IOException 異常,而是將該異常交由 JVM 處理
import java.io.FileInputStream;
import java.io.IOException;
public class ThrowsTest {
public void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
}
}
如果某段程式碼中呼叫了一個帶 throws 宣告的方法,該方法宣告丟擲了 Checked 異常,則表明該方法希望它的呼叫者來處理該異常。那麼呼叫者在呼叫該方法時,要麼將其放入 try 塊中並顯示捕獲該異常,要麼放在另一個帶 throws 宣告丟擲的方法中。
示例程式碼如下:
import java.io.FileInputStream;
import java.io.IOException;
public class ThrowsTest2 {
public static void test() throws IOException {
/* 因為 FileInputStream 的構造器宣告丟擲 IOException 異常
所以呼叫 test() 方法 的程式碼要麼處於 try-catch 塊中
要麼處於另一個帶 throws 宣告丟擲的方法中
*/
FileInputStream fis = new FileInputStream("a.txt");
}
public static void main(String[] args) throws Exception {
/* 因為 test() 方法宣告丟擲 IOException 異常
所以呼叫該方法的程式碼要麼處於 try-catch 塊中
要麼處於另一個帶 throws 宣告丟擲的方法中
*/
test();
}
}
主動丟擲異常 throw
如果 throw 語句丟擲的異常是 Checked 異常,則該 throw 語句要麼處於 try 塊裡,顯式捕獲該異常,要麼放在一個帶 throws 宣告丟擲的方法中;如果 throw 語句丟擲的是 Runtime 異常,則無需放在 try 塊裡,也無需放在帶 throws 宣告丟擲的方法中,既可以顯式的用 try-catch 來捕獲並處理異常,也可以完全不理會該異常,把該異常交給該方法呼叫者處理。
import java.io.IOException;
public class ThrowTest3 {
public static void throwChecked(int a) throws Exception {
if (a > 0) {
// 自行丟擲 Exception 異常
// 該程式碼必須處於 try 塊裡,或處於帶 throws 宣告的方法中
throw new Exception("a的值大於0,不符合要求");
}
}
public static void throwRuntime(int a) {
if (a > 0) {
// 自行丟擲 RuntimeException 異常
// 既可以捕獲該異常,也可以完全不理會該異常,把異常交給方法呼叫者處理
throw new RuntimeException("a的值大於0,不符合要求");
}
}
public static void main(String[] args) {
try {
// 呼叫宣告丟擲 Checked 異常的方法,要麼顯式在 try-catch 中捕獲該異常,要麼在 main 方法中再次宣告丟擲
throwChecked(3);
} catch (Exception e) {
System.out.print(e.getMessage());
}
// 呼叫宣告丟擲 Runtime 異常的方法既可以顯式捕獲該異常,也可以不理會該異常
throwRuntime(3);
}
}
自定義異常類
public class AuctionException extends Exception {
// 無參構造器
public AuctionException() {}
// 帶一個字串引數的構造器
public AuctionException(String msg) {
super(msg);
}
}
異常鏈
將原始資訊隱藏起來,僅向上提供必要的異常提示資訊的處理方式,可以保證底層異常不會擴散到表現層,避免向上暴露太多的細節,符合面向物件的封裝原則。
public calSal() throws SalException {
try {
// 實現結算工資的業務邏輯
...
} catch (SQLException sqle) {
// 將原始異常記錄下來,留給管理員
...
// 下面異常中的 message 就是給使用者的提示
throw new SalException("訪問資料庫異常“);
} catch (Exception e) {
// 將原始異常記錄下來,留給管理員
...
// 下面異常中的 message 就是給使用者的提示
throw new SalException("系統出現未知異常“);
}
}
歡迎關注我的公眾號
相關推薦
Java 基礎篇之異常
異常 異常層次 Error:Java 執行時系統的內部錯誤和資源耗盡錯誤。應用程式不應該丟擲這種型別的物件。如果出現了這樣的內部錯誤,除了通告給使用者,並盡力使程式安全地終止之外,再也無能為力了。 Exception RuntimeException:由程式錯誤導致的異常 其他異常:程式本身沒有問題,
java基礎篇之nio與aio
sre 非阻塞 只有一個 accept ava 使用步驟 截取 city writable 1.同步和異步 同步:指一個任務運行完以後接著運行下一個任務 異步:接到一個任務後開啟一個新的線程運行此任務,基本不占用原線程時間 2.阻塞與非阻塞 阻塞:多個線程同時訪問一份數據時
Java基礎篇之常量、變數、運算子
資料型別 : Java中的基本型別功能簡單,不具備物件的特性,為了使基本型別具備物件的特性,所以出現了包裝類,就可以像操作物件一樣操作基本型別資料。 基本型別對應的包裝類 基本型別 byte int short long float double boolean char 包裝型別
Java基礎篇之順序、選擇、迴圈結構
程式流程 java程式語句執行的順序包括4種基本控制結構:順序結構、選擇結構、迴圈結構、異常處理邏輯結構。 順序結構 Java程式中,語句執行的基本順序按各語句出現的位置先後順序執行,即為順序結構。 例1:順序結構:已知三角形三邊,求三角形面積: pub
java基礎篇之-----------抽象類 、最終類、介面
一、抽象類: 我們把一類事物抽象出來,類中只宣告方法,不實現,這就是抽象類存在的意義; 抽象類: 含有抽象方法的類,被abstract 關鍵字修飾; 抽象方法:只有方法宣告沒有方法實體,被abstract關鍵字修飾; 注意要點: 1、抽象類沒有例項物件,只能通過別的類繼承實現抽象方法
Java基礎篇之環境搭建
伺服器環境:Centos jdk安裝包:.tar.gz 第一步:在官網下載JDK安裝包 第二步:解壓縮安裝包:tar -xzvf jdk-8u131-linux-x64.tar.gz -C /usr/local/java ps:壓縮到/usr/local/java目錄
java基礎篇之GC
概述 java和C++有著一堵 記憶體動態分配 和 垃圾收集技術 圍成的“高牆”,外面的人想進去,裡面的人想出來。 java垃圾回收 GC(Garbage Collection) 的歷史比java還要久遠,1960年誕生的Lisp語言當時就在考慮三個問題:
java基礎篇之最基礎
靜態程式碼塊執行一次,隨著類載入而載入 public class Test { static HashMap hashMap = new HashMap(){ // map優雅的寫法 { put("1","2"
java基礎篇之5-------一維陣列的拷貝
作業: 1、{1,2,3,4,5,6} 將奇數放在偶數前面 大小順序不要求 public static int[] sortArray(int[] a) { int odd = 0;// 奇數下標 int even
Java 基礎篇之程式設計基礎
基本資料型別 java 是強型別語言,在 java 中儲存的資料都是有型別的,而且必須在編譯時就確定其型別。 基本資料型別變數儲存的是資料本身,而引用型別變數存的是資料的空間地址。 基本型別轉換 自動型別轉換 把一個表數範圍小的數值或變數直接賦給另一個表數範圍大的變數時,系統將會進行自動型別轉換,否則需要
Java 基礎篇之集合
List 集合 List 集合中元素有序、可重複,集合中每個元素都有其對應的索引順序。 List 判斷兩個物件相等,只要通過 equals 方法比較返回 true 即可。 看個例子: public class A { public boolean equals(Object obj) {
Java 基礎篇之反射
反射 使用反射獲取程式執行時的物件和類的真實資訊。 獲取 Class 物件 每個類被載入之後,系統會為該類生成一個對應的 Class 物件,通過該 Class 物件可以訪問到 JVM 中的這個類。 使用 Class 類的 forName(String clazzName) 靜態方法。字串引數的值是某個類
java基礎學習之小知識點篇一
java基礎學習之小知識點 1.程式碼塊 分類 2.super和this的注意點 3.過載(overload)和重寫(override) 4.final修飾符 final指的是**最終的**。 注意點:
贏在面試之Java基礎篇
1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制? 可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。 2、Java有沒有goto? java中的保留字,現在沒有在java中使用。 3、說說&
Java基礎加強之多執行緒篇 - 執行緒建立與終止、互斥、通訊、本地變數
執行緒建立與終止 執行緒建立 Thread類與 Runnable 介面的關係 public interface Runnable { public abstract void run(); } public class Thread implements Run
黑馬程式設計師—【Java基礎篇】之語言基礎———for巢狀迴圈練習題
------- android培訓、java培訓、期待與您交流! --------- 上篇分享和總結了Java語言基礎程式流程控制和函式; 那麼接下來我繼續為大家分享for巢狀迴圈2道練習題。 /** * 第1題:用控制檯程式倒著輸出九九乘法表;輸出結果按下圖所示
1.偏頭痛楊的中高階java後端面試題攻略系列之java基礎篇(持續更新)
前戲即使不跳槽也建議每隔一段時間出去面試幾次,面試的目的不在於拿offer入職,而是在於你知道你自己目前的水平是幾斤幾兩,是否有被市場所淘汰的危機。終身學習,居安思危,保持危機意識。每個人的時間與精力都是有限的,有限的時間做有限的事情,不要什麼都學,做減法,要有自己的強項,知
Django基礎篇之數據庫選擇及相關操作
setting 必須 需要 mysql pyc -- creates 127.0.0.1 settings 在djanjo框架中我們最常用的框架分別就是mysql和sqlit了,下面我們將分別講述一下這倆種數據庫的基礎必備知識 mysql 一、利用命令創建(在終端上執行)
Java基礎學習筆記八 Java基礎語法之接口和多態
java cas 發現 過程 類類型 結果 覆寫 實例 new 接口 接口概念 接口是功能的集合,同樣可看做是一種數據類型,是比抽象類更為抽象的”類”。接口只描述所應該具備的方法,並沒有具體實現,具體的實現由接口的實現類(相當於接口的子類)來完成
JAVA基礎篇—接口實現動態創建對象
一個 n) ges pack out string sta else if stat Scanner在控制臺輸入內容 package com.Fruit; public interface Fruit {//提供接口 } package com.Fruit; public