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
	}
	
}

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