Lombok的@SneakyThrows详解
[TOC]
一、简介
在java
的异常体系中Exception
异常有两个分支,一个是运行时异常RuntimeException
,一个是编译时异常,在Exception
下的所有非RuntimeException
异常,比如IOException
、SQLException
等;所有的运行时异常不捕获,编译时异常是一定要捕获,否则编译会报错。@SneakyThrows
就是利用了这一机制,将当前方法抛出的异常,包装成RuntimeException
,骗过编译器,使得调用点可以不用显示处理异常信息。
二、原理
1 | /* |
如下为反编译之后的结果
1 | private void sneakyThrowsTest() { |
那么问题来了,为什么这个地方可以对原来的异常进行强转为RuntimeExcption
?以下为直接强转的代码,显然运行之后报类型转换异常。
1 | private void sneakyThrowsTest() { |
实际上,这种做法是一种通过泛型欺骗了编译器,让编译器在编译期不报错(报警告),而最后在JVM
虚拟机中执行的字节码的并没有区别编译时异常和运行时异常,只有是不是和抛不抛异常而已。