菜雞的Java學習筆記——異常和異常處理
阿新 • • 發佈:2021-01-17
技術標籤:Java
# Java學習筆記——異常和異常處理
- Throwable:Error,Exception
- Exception:RuntimeException(非檢查異常),檢查異常
- RuntimeException:NullPointerException(空指標異常),ArrayIndexOutOfBoundsException(陣列下標越界異常),ClassCastException(型別轉換異常),ArithmeticException(算數異常)
- 檢查異常:IOException(檔案異常),SQL異常(SQLException),需要手動新增捕獲以及處理語句。
## 處理異常
try-catch
:
try{
//一些會丟擲異常的方法
}catch(Exception e){
//處理該異常的程式碼塊
}
如果丟擲異常,則終止程式,程式的控制權將被轉移交給catch塊中的異常處理程式,可以發出警告,也可以進行錯誤日誌記錄,下面的例子對錯誤進行警告處理
try{
System.out.print("請輸入您的年齡:");
Scanner input = new Scanner(System.in);
int age = input.nextInt();
System.out.println("十年後您" + (age + 10) + "歲");
}catch(InputMismatchException e){
System.out.println("請輸入整數!");
}
System.out.println("謝謝使用!");
輸入小數,執行結果
如果丟擲很多型別的異常,需要用到多重catch塊
try{
//一些會丟擲異常的方法
}catch(Exception e){
//處理異常Exception的方法
}catch(Exception2 e){
//處理異常Exception2的方法
}...(n個catch 塊)...{
}
下面的例子可能出現兩種異常,針對每種異常分別處理
try{
Scanner input = new Scanner(System.in);
System.out.print("請輸入第一個數:");
int a = input.nextInt();
System.out.print("請輸入第二個數:");
int b = input.nextInt();
System.out.println("兩數相除結果是:" + a / b);
}catch(InputMismatchException e){
//e.printStackTrace();//列印異常
System.out.println("請輸入整數!");
}catch(ArithmeticException e){
System.out.println("除數不能為0!");
}
執行結果
在catch異常時,要按照子類-父類的順序進行檢測,在上面的例子中,InputMismatchException
異常必須在ArithmeticException
異常的前面,否則編譯器會報錯
try-catch-finaly
用於最終將要執行的程式碼,進行“善後工作”
try{
//一些會丟擲異常的方法
}catch(Exception e){
//處理異常Exception的方法
}catch(Exception2 e){
//處理異常Exception2的方法
}...(n個catch塊)...{
}finally{
//最終要執行的一些程式碼
}
## 異常丟擲
throw
——將產生的異常丟擲(動作)
throws
——宣告將要丟擲何種型別的異常(宣告)
public void divide(int a, int b) throws Exception{
if(b == 0)//出現異常
throw new Exception("除數不能為0!");//向上級報告
else
System.out.println("相除結果為:" + a /b);
}
## 自定義異常
藉助於Java現存的異常型別,例如Exception,自定義異常要繼承Exception類或者其子類 public class 異常名 extends Exception
例子:在圖書查詢系統中,若查詢的書不存在,則出現BooknotExistException
異常,定義方法如下
public class BooknotExistException extends Exception{
public BooknotExistException(){
super("圖書不存在!");
}
}
//異常檢測中輸出錯誤資訊
catch(BooknotExistException e){
System.out.println(e.getMessage());
## 圖書查詢系統檔案程式碼
//自定義異常
public class BooknotExistException extends Exception{
public BooknotExistException(){
super("圖書不存在!");
}
}
//自定義異常
public class ErrorCommandException extends Exception{
public ErrorCommandException(){
super("命令輸入錯誤,請根據提示輸入命令!");
}
}
import java.util.InputMismatchException;
import java.util.Scanner;
public class SearchBook{
String[] Book={"資料結構","大學物理"};
Scanner input = new Scanner(System.in);
int command;
String name;
int num;
public static void main(String[] args) {
while(true){
SearchBook searchBook = new SearchBook();
searchBook.inputCommand();
if(searchBook.command == 1)
searchBook.inputName();
else if(searchBook.command == 2)
searchBook.inputNumber();
else if(searchBook.command == 0)
break;
}
}
public void inputCommand(){
try{
System.out.println("輸入命令:1-按照名稱查詢圖書,2-按照序號查詢圖書,0-結束查詢");
command = input.nextInt();
if(command != 1 && command != 2 && command !=0){
throw new ErrorCommandException();
}
}catch(InputMismatchException e1){
ErrorCommandException ee = new ErrorCommandException();
System.out.println(ee.getMessage());
} catch(ErrorCommandException e){
System.out.println(e.getMessage());
}
}
public void inputName(){
try{
System.out.println("輸入圖書名稱:");
name = input.next();
for(int i = 0; i < Book.length; i++){
if(Book[i].equals(name)){
System.out.println("book:" + Book[i]);
return;
}
}
throw new BooknotExistException();
}catch(BooknotExistException e){
System.out.println(e.getMessage());
}
}
public void inputNumber(){
try{
System.out.println("輸入圖書序號:");
num = input.nextInt();
if(num > 2 ){
throw new BooknotExistException();
}
System.out.println("book:" + Book[num - 1]);
}catch(InputMismatchException e1){
input.nextLine();
ErrorCommandException ee = new ErrorCommandException();
System.out.println(ee.getMessage());
}catch(BooknotExistException e2){
System.out.println(e2.getMessage());
}
}
}