本文收录在猪哥 GitHub:https://github.com/pig6/Java 中,本我的项目收集一线大厂面试、实战、Java 学习路线等。
一、异样产生的原理
JVM 针对程序运行监测出的异样创立个异样对象,对象蕴含了异样产生的:内容、起因、地位。依据程序逻辑将异样对象层层抛出或者解决。
二、Throwable 体系
1.Error
谬误 Error 个别是指 java 虚拟机相干的问题,如零碎解体、虚拟机出谬误、动静链接失败等,这种谬误无奈复原或不可能捕捉,将导致应用程序中断,通常应用程序无奈解决这些谬误,因而应用程序不应该捕捉 Error 对象,也毋庸在其 throws 子句中申明该办法抛出任何 Error 或其子类。
-
VirtualMachineError
- OutOfMemoryError
- StackOverflowError
-
LinkageError
- NoClassDefFoundError
- NoSuchMethodError
- 。。。
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
- 无论是否出现异常都会执行
- 必须与 try 一起应用
- 留神:finally 中有 return 语句永远返回 finally 中的 return,try 块中的 return 不会失效
六、其余
- 如果父类抛出了多个异样,子类重写父类办法的时候,抛出和父类雷同的异样 // 是父类异样的子类 // 或者不抛出
- 父类办法没有抛出异样,子类重写父类该办法的时候也不能够抛出异样。此时子类产生该异样,只能捕捉解决,不能申明抛出
-
应用习惯:
- 不要抛弃异样,捕捉异样后须要进行相干解决。如果用户感觉不能很好地解决该异样,就让它持续流传,传到别的中央去解决,或者把一个低级的异样转换成利用级的异样,从新抛出
- catch 语句应该指定具体的异样类型。不能把不该捕捉的异样也捕捉了
- 在 finally 外面开释资源。如果 finally 外面也会抛出异样,也一样须要应用 try..catch 解决
- 不要把大量的代码塞在 try…catch 块外面,拆散各个可能出现异常的语句并别离捕捉异样
遗留问题: 编码中是该捕捉 Exception 还是 Throwable 呢?欢送评论区交换!!