異常
- 異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數爲零、需要處理的文件不存在、數組下標越界等。 在Java的異常處理機制中,引進了很多用來描述和處理異常的類,稱爲異常類。異常類定義中包含了該類異常的信息和對異常進行處理的方法。
- 異常處理過程
-
拋出異常:在執行一個方法時,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,並把異常對象提交給JRE。
-
捕獲異常:JRE得到該異常後,尋找相應的代碼來處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼爲止。
try {
System.out.println(1 / 0);
}catch (Exception e){
System.out.println("出錯了");
e.printStackTrace();
}
- 所有異常的根類爲java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,異常又分爲受檢異常和不受檢異常(運行時異常)
- Error是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題
運行時異常RuntimeException
- 派生於RuntimeException的異常,如被 0 除、數組下標越界、空指針等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大。 因此由系統自動檢測並將它們交給缺省的異常處理程序(用戶可不必對其處理)
- 需要增加邏輯判斷處理
受檢異常CheckedException
- 這類異常在編譯時就必須做出處理,否則無法通過編譯
- 異常的處理方式有兩種:使用“try/catch”捕獲異常、使用“throws”聲明異常
- try catch finally,可以有多個catch
try {
System.out.println("可能異常的語句");
System.out.println(1 / 0);
}catch (Exception e){
System.out.println("出錯了");
//e.printStackTrace();
}finally {
System.out.println("總算結束了");
}
- 讀文件
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestReadFile {
public static void main(String[] args) {
FileReader fileReader = null;
try {
fileReader = new FileReader("D:\\data\\shuihu.txt");
char c1 = (char)fileReader.read();
System.out.println(c1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) { //多個異常,子類在前,父類在後
e.printStackTrace();
}finally {
if(fileReader != null){
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
throws
- 當CheckedException產生時,不一定立刻處理它,可以再把異常throws出去,
- 如果一個方法中可能產生某種異常,但是並不能確定如何處理這種異常,則應根據異常規範在方法的首部聲明該方法可能拋出的異常。 如果一個方法拋出多個已檢查異常,就必須在方法的首部列出所有的異常,之間以逗號隔開
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestThrow {
public static void main(String[] args) {
String path = "D:\\data\\shuihu.txt";
//處理異常,或者在方法後繼續標記拋出異常
try {
readFile(path);
} catch (IOException e) {
e.printStackTrace();
}
}
static void readFile(String path) throws IOException {
FileReader fileReader = new FileReader(path);
char c1 = (char)fileReader.read();
System.out.println(c1);
if(fileReader != null){
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
自定義異常
- 自定義異常類如果繼承Exception類,則爲受檢查異常,必須對其進行處理;如果不想處理,可以讓自定義異常類繼承運行時異常RuntimeException類。
- 習慣上,自定義異常類應該包含2個構造器:一個是默認的構造器,另一個是帶有詳細信息的構造器。
public class TestDefinedException {
public static void main(String[] args) {
Person p = new Person();
p.setAge(10000);
p.setName("高爾基 西莫維奇·彼什科夫");
}
}
class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 0 || age > 130){
//運行時異常
throw new IllegalAgeException("年齡有誤");
}else{
this.age = age;
}
}
public String getName() {
return name;
}
public void setName(String name) {
if(name.length()>10){
try {
//Name的受檢異常,必須trycatch或方法後標記拋出
throw new IllegalNameException("名字太長");
} catch (IllegalNameException e) {
e.printStackTrace();
}
}else {
this.name = name;
}
}
}
class IllegalAgeException extends RuntimeException{
/*
運行時異常
*/
public IllegalAgeException(){
}
public IllegalAgeException(String info){
super(info);
}
}
class IllegalNameException extends Exception{
public IllegalNameException(){}
public IllegalNameException(String info){
super(info);
}
}