类反射newInstance创造对象的异常逃逸事件

项目场景:

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,别说不知道怎么切换。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/19bf10cb27e34b52965e383c62228be3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6IKl5LuU5ZOl5ZOlMTkzMA==,size_20,color_FFFFFF,t_70,g_se,x_16) 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,拥抱++

猜你喜欢

转载自blog.csdn.net/zwrlj527/article/details/122982970