静态方法抛出运行时异常导致反射生成实例失败

简介: 静态方法抛出运行时异常导致反射生成实例失败

静态方法抛出运行时异常导致反射生成实例失败

文章目录

场景还原

1. 启动时,static属性获取时便打印了异常,不过没有注意到。
2. 之后在异常无法捕获之处既无正常往下走到return,也没有被Catch捕获异常,甚至在该行无法Step in进入debug,最终被外层的finally块处理。

生成实例失败的类

public class InnerPositionThread extends MonitorThread {
    Logger logger = LoggerFactory.getLogger(getClass());
    private static Map<String, List<BlockField>> blockAttrCfg = BlockUtils.getBlocks("innerposition.xml");
}

抛出运行时异常的方法

public class BlockUtils {
    public static Map<String, List<BlockField>> getBlocks(String templateName) {
        try {
            // do something
            }
        } catch (Exception var14) {
            var14.printStackTrace();
            throw new RuntimeException(var14);
        }
    }

无法捕获异常之处

try {
  Object monitor;
    // 下面这行将会异常
  monitor = (IfMonitor)Class.forName(mClass).newInstance();
  return null;
} catch (Exception var4) {
  log.error("启动监视器失败 " + config.getName() + " (" + monitorKey + ")", var4);
  return getStartFalseResponse(config, monitorKey, isCreate ? "监视器已建立,激活失败" : "启动监视器失败");
}

重试

另起工程简化示例进行查看原因。

接口

public interface InterfaceA {
    void functionA();
}

静态属性初始化抛出异常

public class ClassImplA implements InterfaceA {
    private static Logger logger = LoggerFactory.getLogger(ClassImplA.class);
    private static Long staticProperties = initStaticProperties();
    private static Long initStaticProperties() {
        throw new RuntimeException("ClassImplA throw runtime exception");
    }
    @Override
    public void functionA() {
        logger.info("function A be called!");
    }
}

测试main方法

public static void main(String[] args) {
        logger.info("start main");
        Object classAImpl;
        String className = ClassImplA.class.getName();
        logger.info("start get class A");
        try {
            classAImpl = (InterfaceA)Class.forName(className).newInstance();
            ((InterfaceA)classAImpl).functionA();
        } catch (Exception e) {
            logger.error("catch exception反射失败" + e.getMessage());
        } catch (Error e) {
            logger.error("catch error反射失败" + e.getMessage());
        } finally {
            logger.info("in finally end get class A");
        }
        logger.info("end main");
    }

测试输出

六月 02, 2020 2:34:52 下午 forname.MainTest main
信息: start main
六月 02, 2020 2:34:52 下午 forname.MainTest main
信息: start get class A
六月 02, 2020 2:34:52 下午 forname.MainTest main
严重: catch error反射失败null
六月 02, 2020 2:34:52 下午 forname.MainTest main
信息: in finally end get class A
六月 02, 2020 2:34:52 下午 forname.MainTest main
信息: end main

观察捕获到Error,而非Exception,打印堆栈可见,其最终抛出的错误是ExceptionInInitializerError。

java.lang.ExceptionInInitializerError
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:264)
  at forname.MainTest.main(MainTest.java:16)
Caused by: java.lang.RuntimeException: ClassImplA throw runtime exception
  at forname.ClassImplA.initStaticProperties(ClassImplA.java:12)
  at forname.ClassImplA.<clinit>(ClassImplA.java:9)
  ... 3 more

通过查看该类的继承发现ExceptionInInitializerError继承LinkageError,再继承Error,最终继承Throwable,所以该ExceptionInInitializerError不会被Exception的catch块捕获。

结论

通过请教他人得知:

  1. 这类Error必须干掉,不能带进程序,
  2. static属性初始化也不允许抛出异常,
  3. catch块也不能去抓取error或者Throwable的错误。
目录
相关文章
|
4月前
|
人工智能 运维 监控
HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践
本书《HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践》深入探讨了鸿蒙系统的运维管理。从架构特点到实际操作,涵盖分布式能力、性能优化、安全维护及故障排查。内容包括设备管理、系统监控、安全管理等核心任务,提供常见问题解决方案与工具推荐。面对未来超级终端和AI赋能的挑战,运维人员需不断学习,以充分发挥鸿蒙的分布式优势,为用户带来流畅体验。
231 8
|
10月前
|
机器学习/深度学习 边缘计算 人工智能
第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025) 2025 2nd international Conference on Edge Computing, Parallel and Distributed Computing
第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025) 2025 2nd international Conference on Edge Computing, Parallel and Distributed Computing 机器学习 计算学习理论 数据挖掘 科学计算 计算应用 数字图像处理 人工智能
221 6
|
7月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
314 0
一文彻底搞明白C语言的数组
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的音乐推荐管理系统
基于Java+Springboot+Vue开发的音乐推荐管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的音乐推荐管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
219 8
基于Java+Springboot+Vue开发的音乐推荐管理系统
|
10月前
|
安全 测试技术 持续交付
云计算时代的软件开发与测试:高效、灵活、可扩展
云计算时代的软件开发与测试:高效、灵活、可扩展
|
消息中间件 缓存 NoSQL
构建高效后端服务:微服务架构的深度实践
本文旨在探讨如何通过采用微服务架构来构建高效的后端服务。我们将深入分析微服务的基本概念、设计原则以及在实际项目中的应用案例,揭示其在提升系统可维护性、扩展性和灵活性方面的优势。同时,本文还将讨论在实施微服务过程中可能遇到的挑战,如服务治理、分布式事务和数据一致性等问题,并分享相应的解决策略和最佳实践。通过阅读本文,读者将能够理解微服务架构的核心价值,并具备将其应用于实际项目的能力。 ##
|
弹性计算 开发框架 .NET
阿里云服务器和虚拟主机有什么区别?多维度对比
阿里云虚拟主机便于快速建站,适合初学者,预装常用环境如PHP、ASP等,操作简易。云服务器ECS则提供全面权限与弹性扩展能力,不仅限于建站,亦可用于APP、游戏等场景,更适合技术娴熟的用户。尽管虚拟主机价格较低,但鉴于云服务器性能优越且价格持续下降,推荐选择云服务器以获取更佳性价比与广泛的应用场景。
402 3
|
消息中间件 算法 安全
操作系统处理多进程的问题及解决方案
【8月更文挑战第23天】
739 1
银河麒麟桌面操作系统中获取硬盘序列号
银河麒麟桌面操作系统中获取硬盘序列号
|
机器学习/深度学习 人工智能 自然语言处理
🔬技术宅必看!AI Prompt深度解析,商业数据分析的科学魔法
【8月更文挑战第1天】在快速发展的科技领域中, AI Prompt 正革新商业数据分析方式。它通过自然语言指令, 驱动 AI 模型实现数据洞察。本文探讨 AI Prompt 的定义、原理及其在商业分析中的应用。**最佳实践包括**: 精准设计 Prompt 以确保清晰具体的指令; 结合领域知识优化 Prompt, 提升分析准确性; 采用迭代法, 根据反馈持续改进模型性能。掌握 AI Prompt 技术, 不仅提高效率, 更能洞察商机, 创造价值。
527 0