认识异常
异常指的是导致程序执行中断的一种指令流,一旦异常产生而且没有正常处理的话,那么程序将会中断执行。
所有的异常类都是 Throwable类的子类,而 Throwable类又是Object的子类,从JDK1.0开始提供。
但是在开发中是几乎不会使用 Throwable类处理异常,而是使用 Throwable类下面的 Exception和
- Error两个子类。
于是有一道面试题:请解释 Throwable类下的 Exception类和 Error类:
Error:在程序还未执行时出现的错误,一般指的都是JVM出错,用户无法处理。
Exception:指的是在程序运行中出现的异常,异常处理都是针对此类型完成的。
异常处理流程
1 当程序中产生异常之后,会由JVM自动的根据异常类型实例化一个指定的异常对象。
2 程序需要判断当前的代码之中是否存在有异常处理逻辑,如果没有,则交由JVM处理,而后中断程序执行。
3 如果程序中存在异常处理,则try语句会捕获该异常类的实例化对象(想象为引用传递)。
4 捕获到的异常类实例化对象要与catch中的异常类型进行匹配。
5 如果catch匹配了该异常类型则使用相应的代码进行处理,随后要执行finally代码,如果没有任何一个异常类型与catch匹配,则直接跳转final语句。
6 执行完finally代码之后要判断该异常是否已经处理过了,如果已经处理过了则继续执行后续代码,如果没有处理,则程序继续交由JVM处理。
注意:按照对象向上转型的原则,所有的子类对象都可以向父类转换,即所有异常都可以使用Exception进行处理。(按照开发团队要求是否明确异常类型处理)
异常处理
关键字
try...catch:捕获异常并处理异常。
throws:明确的告诉用户执行某一个方法中有可能会产生哪些异常,主要用于方法的声明处。
throws并不处理异常,而是交给上一级进行处理,也就是说,调用有throws的方法就需要用try...catch处理异常,如果在main方法使用throws那么将交由JVM处 理。
throw:异常对象一般是由JVM实例化,但是有了throw,用户就可以自己去实例化异常对象,如果要抛出这个对象,就必须使用throw关键字。
finall:一定会执行的代码块。
面试题:请解释throw与throws的区别
throw:在方法体中使用,表示手工抛出一个异常类的实例化对象。
throws:在方法的声明中使用,表示此方法调用时必须明确进行异常处理。
实际应用:
1 try...catch (不叙述)
2 try...catch,throws,throw,finally
class MyMath{public static int div(int x,int y)throws Exception{int result=0;//保存计算结果System.out.println("**** 除法计算开始 ****");try{result=x/y;}catch (Exception e) {throw e;//继续向上抛}finally{System.out.println("**** 除法计算结束 ****");}return result;}
}public class ExcDemo {public static void main(String[] args) {try {System.out.println(MyMath.div(10, 0));} catch (Exception e) {e.printStackTrace();}}
}
RuntimeException
面试题:请解释Exception和RuntimeException的区别RunTimeException是Exception的子类;
Exception定义的异常都需要进行强制性的处理,而RuntimeException下的子类在编写代码时不需要进行强制的异常处理,
有用户自己选择,如果不进行处理并产生异常将交由JVM处理。
自定义异常类
class ScoreException extends Exception{public ScoreException(String msg){super(msg);}
}public class ExcDemo {public static void main(String[] args) throws Exception{double score=101.0;if(score>100.0){throw new ScoreException("成绩不能大于100");}}
}