java异常继承关系
Erro:
- 程序无法处理的错误,编译器不做检查。
- 属于JVM需要负担的责任
- 常见error:NoClassDefFoundError(找不到class定义的异常);OutOfMemoryError(内存溢出异常);StackOverflowError(深递归导致栈被耗尽而抛出的异常)
Exception:
- 程序可以处理的异常,捕获之后可以恢复。
- 分为RuntimeException(非检查异常)和checked Exception(检查异常);
- RuntimeException是程序运行时发生的异常,是程序应该负担的责任。
- checked Exception是编译时可以发现的异常,是java编译器应该承担的责任。
- 常见RuntimeException:NullPointeException(空指针异常);ClassCastException(类型强。制转换异常);IllegalArgumentException(传递非法参数异常);IndexOutOfBoundsException(下标越界异常);NumberFormatException(数字格式异常)等。
- 常见checked Exception:ClassNotFoundException(找不到指定class的异常);IOException(IO操作异常)
异常影响性能:
- try-catch语句会影响jvm对代码的优化,所以应该只包含必要的代码段;
- 每次实例化一次Exception,jvm对线程栈进行一次快照,这是一个比较重的操作,非常耗费资源;
Throw&Throws
Throws:
- 用在方法后面,把异常向上抛出,在调用该方法处进行try catch。
- throws可以抛多个异常。
- 当java代码发生异常时,由jvm抛出异常对象,导致代码中断,这个时候jvm做的操作就是:创建异常对象,然后抛出。
- throws Exception表示的是本方法不处理异常,交给被调用处处理,而且被调用处必须处理(必须加try catch,不然编译不过)
- 如果方法后面不加throws Exception,方法出了异常就会向上传递抛出,如果调用者没有处理,继续向上抛出,最终交给虚拟机处理,程序会中断,但是如果在调用处捕获,程序还可以继续进行,只是抛异常的方法受到影响。(如果你不希望异常层层往上抛,你就要用throws Exception) ,
- 异常处理的原则是尽可能早的catch异常,正常的程序不应该写throws Exception
- 运行异常(继承RuntimeException)可以不捕获,向上抛,如果一直没有处理,则jvm会自动处理(停止线程,打印异常)。
- 非运行异常,必须捕获或者在方法声明
void test()throws IOException,SQLException
{
...
}
Throw:
- 只能抛出一个异常。
- 用来手动抛出异常。
Exception e=new Exception("手动抛出");
throw e;
什么时候try catch异常,什么时候throw异常?
- 笼统的讲就是需要在本级处理的异常就catch,需要上级处理的异常就向上抛出。
- 当你的层需要跟外部分开时,你就需要catch.
比如:service和dao层,在大部分情况下,dao服务于service,但这都属于开发组内部,所以,dao直接throw就可以了。
但是到了service层,调用service的是另外的开发小组(比如客户端小组),从架构上来说,就需要隐藏代码的内部细节,这个时候就必须要catch掉,然后该写日志写日志,改重新封装错误重新封装。
今天的文章throwable error和exception的关系_c amp「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/86151.html