写给自己的JAVA工程师之路-异常
2017-10-14 16:42
309 查看
认识异常
异常指的是导致程序执行中断的一种指令流,一旦异常产生而且没有正常处理的话,那么程序将会中断执行。所有的异常类都是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"); } } }
相关文章推荐
- 写给自己的JAVA工程师之路-正则表达式
- 写给自己的JAVA工程师之路-多线程
- 写给自己的JAVA工程师之路-链表
- 写给自己的JAVA工程师之路-网络体系结构
- 写给自己的JAVA工程师之路-枚举
- 写给自己的JAVA工程师之路-约束和修改数据表
- 写给自己的JAVA工程师之路-计划
- 写给自己的JAVA工程师之路-物理层
- 写给自己的JAVA工程师之路-子查询与连接
- 写给自己的JAVA工程师之路-数据链路层
- 写给自己的JAVA工程师之路-单例模式
- 写给自己的JAVA工程师之路-基础类库
- 写给自己的JAVA工程师之路-MySQL函数
- 写给自己的JAVA工程师之路-抽象类
- 写给我的JAVA工程师之路-数据表操作
- 【Java工程师之路】[1-2.9]java中常见的几种异常
- 写给自己,Java基础整理篇
- 写给初级java测试工程师的一封信
- 【Java工程师之路】[2-2.3]数据库设计三大范式
- 写给自己的Java程序员学习路线图