本文收录在猪哥GitHub:https://github.com/pig6/Java 中,本我的项目收集一线大厂面试、实战、Java学习路线等。

一、异样产生的原理

JVM针对程序运行监测出的异样创立个异样对象,对象蕴含了异样产生的:内容、起因、地位。依据程序逻辑将异样对象层层抛出或者解决。

二、Throwable体系

1.Error

谬误Error个别是指java虚拟机相干的问题,如零碎解体、虚拟机出谬误、动静链接失败等,这种谬误无奈复原或不可能捕捉,将导致应用程序中断,通常应用程序无奈解决这些谬误,因而应用程序不应该捕捉Error对象,也毋庸在其throws子句中申明该办法抛出任何Error或其子类。

  1. VirtualMachineError

    • OutOfMemoryError
    • StackOverflowError
  2. LinkageError

    • NoClassDefFoundError
    • NoSuchMethodError
  3. 。。。

2.Exception

1> 运行时异样 RuntimeException:是指“能够防止的异样”,如 null援用异样,这类异样都是由程序外部起因造成的,是能够防止的,考验开发的严谨性,因而这个问题是咱们作为一名开发必须要防止产生的,再大的公司每年总会有几次事变是因为NPE导致的,咱们如果因为这种问题被通报了就是很难堪的事件了(对生产环境肯定要有足够的敬畏心啊)。

常见的运行时异样有以下几种:

  • NullPointerException
  • ClassCastExecption
  • ArithmeticException
  • IndexOutOfBoundsException
  • ClassNotFoundException

2> 非运行时异样:代表“无奈防止的异样” 如io异样,往往这类异样是因为内部起因造成的,程序自身无奈保障他们不产生,所以这类异样必须捕捉,这就是咱们在应用io资源或者操作线程比方sleep的时候必须要捕捉或者抛出的起因。

常见的有:

  • IOException
  • InterruptedException
  • SQLException
  • 自定义的非RuntimeException

3.Check And UnCheck

1>CheckedException:等价于非运行时异样,要么捕捉,要么抛出,否则编译无奈通过。代表“无奈防止的异样” 如io异样 往往这类异样是因为内部起因造成的,程序自身无奈保障他们不产生
2>UnCheckedException:包含:Error&运行时异样

三、办法

  • toString:异样类信息+异样信息形容
  • getMessage:异样信息形容
  • printStackTrace:最罕用打印残缺的谬误堆栈信息

四、catch还是throw

通常应该捕捉那些晓得如何解决的异样,而将那些不晓得如何解决的异样进行传递。如果想传递一个异样,就必须在办法的申明中增加一个throws说明符,以便告知调用者这个办法可能会抛出异样。

五、finally

  1. 无论是否出现异常都会执行
  2. 必须与try一起应用
  3. 留神:finally中有return语句永远返回finally中的return,try块中的return不会失效

六、其余

  1. 如果父类抛出了多个异样,子类重写父类办法的时候,抛出和父类雷同的异样//是父类异样的子类//或者不抛出
  2. 父类办法没有抛出异样,子类重写父类该办法的时候也不能够抛出异样。此时子类产生该异样,只能捕捉解决,不能申明抛出
  3. 应用习惯:

    • 不要抛弃异样,捕捉异样后须要进行相干解决。如果用户感觉不能很好地解决该异样,就让它持续流传,传到别的中央去解决,或者把一个低级的异样转换成利用级的异样,从新抛出
    • catch语句应该指定具体的异样类型。不能把不该捕捉的异样也捕捉了
    • 在finally外面开释资源。如果finally外面也会抛出异样,也一样须要应用try..catch解决
    • 不要把大量的代码塞在try...catch块外面,拆散各个可能出现异常的语句并别离捕捉异样

遗留问题: 编码中是该捕捉Exception还是Throwable呢?欢送评论区交换!!