Java--異常機制

異常

異常:代碼出現的編譯或者運行時的錯誤
異常包含了錯誤的類型、原因以及位置

異常的分類:

  • 運行時異常–RuntimeException,在編譯時期可以選擇處理或者不處理
  • 編譯時異常–在編譯時期必須處理的異常,是Exception的子類並且是非RuntimeException的子類

異常的體系結構
Throwable

  • Error:出現的不可以處理的嚴重的問題
  • Exception:可以處理的問題
package com.it01;

import java.io.FileWriter;
import java.io.IOException;

/*
 * 	異常的處理方式:
 * 		1-捕獲異常
 * 			try...catch
 * 			try{
 * 				有可能出現問題的代碼;
 * 			}catch(Exception ep){
 * 				處理異常;
 * 			}
 * 		2-拋出去
 * 			不想處理異常或者沒有能力處理異常的時候,我們可以選擇拋出異常,誰調用方法誰處理異常
 * 			使用關鍵字throws在方法的聲明拋出異常
 * 	try...catch	執行順序:try語句-------如果發現異常--------異常下面的代碼不再執行---------catch語句
 * 						try語句-------如沒有發現異常-----------------catch語句不再執行
 * 	jvm處理異常的方式:
 * 		返回異常信息,並且終止程序
 */
public class ExceptionDemo {

	public static void main(String[] args) throws IOException {
		
		function();
		
		method();
	}
	
	public  static void method() throws IOException {
		//編譯時期的異常
		FileWriter fw = new FileWriter("a.txt");
	}

	private static void function() {
		try {
			System.out.println(2/0);
		} catch (ArithmeticException e) {
			// TODO: handle exception
			System.out.println("分母不能爲零");
		}
	}

}

如何處理異常

package com.it01;
/*
 * 	處理多個異常:
 * 		可以使用多個try---catch語句
 * 		使用一個try和多個catch語句
 * 	多個catch之間的順序:
 * 		多個catch之間可以有子父類
 * 		平級之間沒有順序關係
 * 		如果有子父類,父類異常一定要放在後面
 */
public class ExceptionDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//method();
		
		try {
			//空指針異常
			String s = null;
			System.out.println(s.length());
			
			int[] arr = new int[5];
			System.out.println(arr[8]);
			
		} catch (NullPointerException e) {
			// TODO: handle exception
			System.out.println("空指針異常");
		}catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("數組越界");
		}
		
		
		
	}

	private static void method() {
		try {
			//空指針異常
			String s = null;
			System.out.println(s.length());
		} catch (NullPointerException e) {
			// TODO: handle exception
			System.out.println("空指針異常");
		}
		
		try {
			//數組越界
			int[] arr = new int[5];
			System.out.println(arr[8]);
		} catch (ArrayIndexOutOfBoundsException e) {
			// TODO: handle exception
			System.out.println("數組越界");
		}
	}

}

Throwable的常用方法

  • String toString()
  • String getMessage()
  • void printStackTrace()
package com.it02;
/*
 * 	Throwable的常用方法
 * 		String toString()  
 * 		String getMessage()  
 * 		void printStackTrace()  
 */
public class ExceptionDemo4 {

	public static void main(String[] args) {
		try {
			System.out.println(2/0);
		} catch (ArithmeticException e) {
			// TODO: handle exception
			e.toString();//錯誤類型和原因
			e.getMessage();//錯誤原因
			e.printStackTrace();//返回類型原因和位置
			//System.out.println("錯誤");
		}
		
	}

}

finally

package com.it02;

import java.io.FileWriter;
import java.io.IOException;

/*
 * 	finally:組合try--catch語句用於釋放資源等收尾工作,finally代碼一定會執行
 * 		
 * 	try{
 * 
 * 	}
 * 	catch(){
 * 
 * 	}finally{
 * 
 * 	}
 * 	
 */
public class ExceptionDemo5 {

	public static void main(String[] args) {
		method();
		
		FileWriter fw= null;
		try {
			fw = new FileWriter("a.txt");
			fw.write("hello");
			fw.write("world");
			fw.write("java");
			System.out.println(2/0);
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//釋放資源
			try {
				if (fw!=null) {
					fw.close();
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	private static void method() {
		try {
			System.out.println(2/0);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
			System.out.println("分母不爲0");
		}finally {
			System.out.println("收尾");
		}
	}

}

throws和throw

  • throws:處理異常的一種方式,把異常拋出,調用者處理
  • throw:製造異常的方式,並且結束方法

注意:如果拋出throw的異常時編譯時期的異常,必須在方法聲明處拋出throws

package com.it03;

import javax.management.RuntimeErrorException;

/*
 * 	throws:處理異常的一種方式,把異常拋出,調用者處理
 * 	throw:製造異常的方式,並且結束方法
 * 
 * 	注意:如果拋出throw的異常時編譯時期的異常,必須在方法聲明處拋出throws
 */
public class ExceptionDemo6 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		//boolean flag = checkScore(100);
		//System.out.println(flag);
		
		checkScore(110);

	}
	/*
	 * 
	 
	public static boolean checkScore(int score) {
		//判斷成績是否符合要求
		if (score<0||score>100) {
			return false;
		}
		return true;
	}
	*/
	
	public static void checkScore(int score) throws Exception {
		//判斷成績是狗符合要求
		if (score<0||score>100) {
			//throw new RuntimeErrorException(null);
			//throw new RuntimeErrorException(null,"考試成績不符合要求");
			//throw new Exception("考試成績不符合要求");
			throw new MyException("考試成績不符合要求");
		}
		System.out.println("考試成績符合要求");
		
	}
	
	

}

自定義異常

package com.it03;
/*
 * 	如何書寫自定義異常
 * 		寫一個類去繼承Exception或者RuntimeException,然後實現多個構造
 */
public class MyException extends RuntimeException{

	public MyException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public MyException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章