Java基礎 快速學習(四)
注意:本系列部落格是在作者已經有一年多的C++經驗的基礎上學習Java的個人總結,可能並不適合所有看到這篇部落格的童鞋
異常機制
1.異常
Java的異常分為一下幾種
- 檢查性異常:最具代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。例如要開啟一個不存在檔案時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
- 執行時異常: 執行時異常是可能被程式設計師避免的異常。與檢查性異常相反,執行時異常可以在編譯時被忽略。
- 錯誤: 錯誤不是異常,而是脫離程式設計師控制的問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了,它們在編譯也檢查不到的。
2.丟擲異常及捕獲異常
先看程式碼示例:
/*login.java*/
package exception1;
public class login
{
String ac;
String password;
int code;
public void setAc(String ac)
{
this.ac = ac;
}
public void setPassword(String password)
{
this.password = password;
}
public void setCode(int code)
{
this.code = code;
}
public int Loin() throws Exception //使用throws宣告
{
if (ac.length()>5)
{
throw new Exception("你輸入的使用者名稱太長了"); //丟擲異常
}
if (password.length()<8)
{
throw new Exception("密碼不可以小於8位"); //丟擲異常
}
System.out.println("登陸成功");
return 0;
}
}
/*my.java*/
package exception1;
public class my
{
public static void main(String[] args)
{
login h = new login();
h.setAc("cdd");
h.setPassword("123");
h.setCode(1235);
try // 捕獲異常
{
h.Loin();
} catch (Exception e) // 處理異常
{
System.out.println(e.getMessage());
return;
} finally //該語句塊總是被呼叫執行 常用來作清理工作
{
System.out.println("本次服務結束");
}
return;
}
}
【1】所有的異常類是從 java.lang.Exception 類繼承的子類。
【2】使用 throws 關鍵字來宣告。throws 關鍵字放在方法簽名的尾部。使用 throw 關鍵字丟擲一個異常。
【3】使用 try 和 catch 關鍵字可以捕獲異常。語法如下:
try
{
// 程式程式碼
}catch(ExceptionName e1)
{
//Catch 塊
}
【4】finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。無論是否發生異常,finally
程式碼塊中的程式碼總會被執行。在 finally 程式碼塊中,可以執行清理型別等收尾善後性質的語句。需要注意的是finally不執行的情況:JVM 過早終止(呼叫 System.exit(int));在 finally 塊中丟擲一個未處理的異常。
【5】 Throws丟擲異常的規則:
1) 如果是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那麼可以不使用throws關鍵字來宣告要丟擲的異常,編譯仍能順利通過,但在執行時會被系統丟擲。
2)必須宣告方法可丟擲的任何可查異常(checked exception)。即如果一個方法可能出現受可查異常,要麼用try-catch語句捕獲,要麼用throws子句宣告將它丟擲,否則會導致編譯錯誤
3)僅當丟擲了異常,該方法的呼叫者才必須處理或者重新丟擲該異常。當方法的呼叫者無力處理該異常的時候,應該繼續丟擲,而不是不處理。
4)呼叫方法必須遵循任何可查異常的處理和宣告規則。若覆蓋一個方法,則不能宣告與覆蓋方法不同的異常。宣告的任何異常必須是被覆蓋方法所宣告異常的同類或子類。
3.自定義異常與多重捕獲
使用者自定義異常類,只需繼承Exception類即可。看下面的示例程式碼:
/*Ac_Exception.java*/
package exception1;
public class Ac_Exception extends Exception
{
public Ac_Exception(int id)
{
this.id=id;
}
private int id;
@Override
public String getMessage()
{
return "錯誤:賬戶輸入錯誤 ,錯誤程式碼 "+id;
}
}
/*login。java*/
package exception1;
public class login
{
String ac;
String password;
int code;
public void setAc(String ac)
{
this.ac = ac;
}
public void setPassword(String password)
{
this.password = password;
}
public void setCode(int code)
{
this.code = code;
}
public int Loin() throws Exception,Ac_Exception //使用throws宣告
{
if (ac.length()>5)
{
throw new Ac_Exception(10); //丟擲自定義異常
}
if (password.length()<8)
{
throw new Exception("密碼不可以小於8位"); //丟擲異常
}
System.out.println("登陸成功");
return 0;
}
}
/*my.java*/
package exception1;
public class my
{
public static void main(String[] args)
{
login h = new login();
h.setAc("cddasdas");
h.setPassword("123");
h.setCode(1235);
try // 捕獲異常
{
h.Loin();
} catch (Ac_Exception e) //處理自定義異常
{
System.out.println(e.getMessage());
} catch (Exception e) //因為自定義異常繼承與Exception 所以它放在最後邊,否則回直接攔截他後邊的異常
{
System.out.println(e.getMessage());
return;
} finally // 該語句塊總是被呼叫執行 常用來作清理工作
{
System.out.println("本次服務結束");
}
return;
}
}
4.異常方法
1 public String getMessage()
返回關於發生的異常的詳細資訊。這個訊息在Throwable 類的建構函式中初始化了。
2 public Throwable getCause()
返回一個Throwable 物件代表異常原因。
3 public String toString()
使用getMessage()的結果返回類的串級名字。
4 public void printStackTrace()
列印toString()結果和棧層次到System.err,即錯誤輸出流。
5 public StackTraceElement [] getStackTrace()
返回一個包含堆疊層次的陣列。下標為0的元素代表棧頂,最後一個元素代表方法呼叫堆疊的棧底。
6 public Throwable fillInStackTrace()
用當前的呼叫棧層次填充Throwable 物件棧層次,新增到棧層次任何先前資訊中。
5.Java 內建異常類
1、 java.lang.ArrayIndexOutOfBoundsException
陣列索引越界異常。當對陣列的索引值為負數或大於等於陣列大小時丟擲。
2、java.lang.ArithmeticException
算術條件異常。譬如:整數除零等。
3、java.lang.NullPointerException
空指標異常。當應用試圖在要求使用物件的地方使用了null時,丟擲該異常。譬如:呼叫null物件的例項方法、訪問null物件的屬 性、計算null物件的長度、使用throw語句丟擲null等等
相關文章
- Java基礎 快速學習(二)Java
- Java基礎 快速學習(三)Java
- C++ -> Java快速學習-基礎C++Java
- Java IO學習筆記四:Socket基礎Java筆記
- java基礎學習之四:修飾符Java
- Java基礎學習Java
- JAVA學習--JAVA基礎(一)Java
- 零基礎快速學習Java技術的方法整理Java
- java基礎的學習Java
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- java基礎(四)Java
- Kotlin 基礎學習+快速實踐Kotlin
- Oracle學習快速入門基礎教程Oracle
- java基礎學習(目錄)Java
- java語言基礎學習Java
- java基礎學習之--XMLJavaXML
- Java基礎學習筆記Java筆記
- 學習java需要什麼基礎Java
- java基礎學習:JavaWeb之ServletJavaWebServlet
- JAVA基礎學習篇之反射Java反射
- Java學習之基礎語法Java
- java webService 零基礎學習JavaWeb
- Java基礎-學習筆記05Java筆記
- Java基礎-學習筆記06Java筆記
- Java基礎-學習筆記07Java筆記
- Java基礎-學習筆記04Java筆記
- Java基礎-學習筆記17Java筆記
- Java 基礎學習系列一 —— Java 主要特性Java
- android基礎學習-java篇day8-step3-第四節:java集合AndroidJava
- Java學習之基礎語法練習Java
- Java零基礎小白必看的學習路線圖,快速入門!Java
- 如何快速打好Java基礎?Java
- 零基礎輕鬆入門——JAVA基礎學習Java
- MySQL 基礎知識梳理學習(四)—-GTIDMySql
- java基礎學習_io流之FileInputStreamJava
- java入門基礎學習----泛型Java泛型
- java基礎學習:JavaWeb之JSPJavaWebJS