Java的异常处理机制:
发生异常的方法生成一个异常对象(包含详细信息),交给运行时系统(抛出throw)
系统寻找相应的方法处理异常,从方法的调用栈中查找,回溯直到找到对应的方法(catch)。
或者被java的默认处理程序捕获处理。
1、try{}
catch(Exception e){}
catch(Exception e){}
finally{ //最终处理,都会执行,通常用于关闭文件,清除资源}
语句
尝试运行try中的语句,出现异常则被catch捕获
2、异常的分类:
Throwable: Error和Exception
Error:有java虚拟机生成并抛出,程序中不应该捕获这些异常
Exception(RuntimeException、IOException):java程序中可能出现的异常,需要在程序中处理。
异常分为:检查性异常和非运行时异常。检查性异常需要全部处理否则编译时出错
Exception的常见子类:
ArithmeticException 算术溢出错误
ArrayIndexOutOfBandsException 数组下标异常
ArrayStoreException 数组储存异常,数组复制时目标数组类型不一致
NullPointerException 空指针异常
NumberFormatException 数据格式异常,将非数字直接转换成数值时产生。
OutOfMemoryException 内存溢出异常,对象过大
IOException
FileNotFoundException
NoClassDefFoundException 未找到类定义
3、throw e 重新抛出异常 4、自定义异常:extends Exception,要在程序中主动抛出异常对象throw e
有throw就要有catch
public static void main() { try { throw new ArithmeticException(); } catch(ArithmeticException e) { System.out.println(e); } }
重新抛出:将异常沿着调用方法传递,有调用的方法进行处理
public class ExceptionTest { public static void main(String args[]) { ExceptionTest a= new ExceptionTest(); a.getAnswer(); } public int calcAnswer(int x,int y) throws NumberRangeException { //throws Exception 在方法头部定义中,throw e在方法体中
if(judgement(x)&&judgement(y)) { NumberRangeException e= new NumberRangeException("Number out of Range"); throw e; } return x+y; } public boolean judgement(int i){ if(i<20 && i>10) {return true;} else {return false;} } public void getAnswer() { try { int ans=calcAnswer(5,65); System.out.println(ans); } catch(NumberRangeException e){
//由调用的方法处理异常 System.out.println(e.toString()); } } } class NumberRangeException extends Exception{ /** * 自定义错误:NumberRangeException */ private static final long serialVersionUID = 1L; public NumberRangeException(String msg) { super(msg); } }