Erro和Exception区别&Throw和Throws的区别

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掉,然后该写日志写日志,改重新封装错误重新封装。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值