项目场景:
jdk8真的要退出历史舞台了,就如曾经的6一样,必须得退了。作为java技术人,要拥抱新时代。
springBoot3.0已经明确说了,不支持1.8,而且在今年11月就要出SpringBoot3的正式版了。
早上又看到kafka3也说了弃用对 Java 8 和 Scala 2.12 的支持。
你真的还坚持不拥抱17?
问题描述:
反射newInstance对象不能catch到异常,try是提示补偿的catch哦,不信咱们试试。
package jdk;
import java.lang.reflect.InvocationTargetException;
import lombok.extern.slf4j.Slf4j;
/**
* @author zhengwen
**/
@Slf4j
public class StudentTest {
public StudentTest() {
log.info("StudentTest的无参构造器");
throw new RuntimeException("抛出一个运行时异常");
}
public static void main(String[] args) {
log.info("----测试反射生成对象------");
try {
StudentTest studentTest = StudentTest.class.newInstance();
} catch (InstantiationException e) {
log.error("catch InstantiationException:{}",e.getMessage(),e);
} catch (IllegalAccessException e) {
log.error("catch IllegalAccessException:{}",e.getMessage(),e);
}
}
}
先用1.8的jdk润以下,看控制台:
jdk8这个newInstance不报过时,catch一个没走,直接爆红了。
idea将项目的jdk版本切换成17,别说不知道怎么切换。  file->ProjectStructe,然后这如图所指这2个都得改,要是没有,可以直接点击下面的SDKs下载jdk,还可以选择版本,爽歪歪。
原先的写法再润一次。
看到没,已经被提示是过时的,从9开始就弃用了,jdk17润依然是没有catch到异常,还是爆红的哦。
下面是正确写法:
package jdk;
import java.lang.reflect.InvocationTargetException;
import lombok.extern.slf4j.Slf4j;
/**
* @author zhengwen
**/
@Slf4j
public class StudentTest {
public StudentTest() {
log.info("StudentTest的无参构造器");
throw new RuntimeException("抛出一个运行时异常");
}
public static void main(String[] args) {
log.info("----测试反射生成对象------");
try {
StudentTest studentTest = StudentTest.class.getDeclaredConstructor().newInstance();
} catch (InstantiationException e) {
log.error("catch InstantiationException:{}",e.getMessage(),e);
} catch (IllegalAccessException e) {
log.error("catch IllegalAccessException:{}",e.getMessage(),e);
} catch (InvocationTargetException e) {
log.error("catch InvocationTargetException:{}",e.getMessage(),e);
} catch (NoSuchMethodException e) {
log.error("catch NoSuchMethodException:{}",e.getMessage(),e);
}
}
}
再来run一下:
原因分析:
JDK8的class.newInstance有bug
解决方案:
如果非要用8,就直接catch最大的异常Exception吧。我其实是更愿意拥抱新时代的。
最后来总结下重点:
- 弃用时间:从jdk9开始
- 弃用原因:jdk9以前的newInstance()有bug,异常抓不到,上面演示的淋漓尽致
- 替代方法:clazz.getDeclaredConstructor().newInstance(),通过把构造方法中的所有异常装进InvocationTargetException来避免异常逃逸
就写道这里,大家可以赶快去检查一下大家的newInstance的try catch是不是得优化调整下。
来吧来吧,放弃8,拥抱++