排查Java反射调用的InvocationTargetExcetion问题

news/2024/10/7 12:20:42

在Java中通过反射调用方法时,常见的一个异常是:java.lang.reflect.InvocationTargetException,将异常信息打印到日志文件中时通常会有如下一句信息:java.lang.reflect.InvocationTargetException: null,由于在异常信息中存在"null",一开始就会非常敏感,会误以为是空指针异常。
其实不然,从java.lang.reflect.Method.invoke()方法注释描述中可以知道,当抛出InvocationTargetException异常时表明是在执行底层方法时异常。这里的“底层”并不是指JDK的底层实现,而是相对于反射调用的入口而言,通常是业务代码的实现方法。
Java反射调用Method_invoke

实际上,当出现InvocationTargetException异常时通常会在异常堆栈中同时存在一个提示:Caused by: xxx,只要根据这个提示就能很快定位到具体问题。

最后再来解释日志信息中为什么会出现一个关键字“null”,这很容易让人误以为是业务代码出现了空指针异常!
这是因为在通过日志框架打印异常信息时,会将Throwable.detailMessage属性打印出来,由于在反射调用时InvocationTargetException异常是Java本地方法抛出的,此时该异常对象的detailMessage属性为null,因此在打印出来的日志信息中就看到了“null”关键字,这并不表示是业务代码中抛出了空指针异常。

如下示例代码:

public class ReflectionTest {private static final Logger LOGGER = LoggerFactory.getLogger(ReflectionTest.class);public static void main(String[] args) {try {ReflectionTest test = new ReflectionTest();Method method = test.getClass().getMethod("methodInvokeTest");method.invoke(test);} catch (Exception e) {LOGGER.error("{}", "test", e);}}public void methodInvokeTest() {if (1 == 1) {throw new RuntimeException("在业务方法中抛出异常");}}
}

在DEBUG时可以看到InvocationTargetException对象的detailMessage属性为空。
InvocationTargetException_detailedMessage_null

在打印的日志信息中同样存在InvocationTargetException: null(其实在业务代码中抛出的并非空指针异常)。

2024-05-06 17:46:22,228 ERROR [main] o.e.j.ReflectionTest [ReflectionTest.java:20] test
java.lang.reflect.InvocationTargetException: nullat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_261]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_261]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_261]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_261]at org.example.java.ReflectionTest.main(ReflectionTest.java:18) ~[classes/:na]
Caused by: java.lang.RuntimeException: 在业务方法中抛出异常at org.example.java.ReflectionTest.methodInvokeTest(ReflectionTest.java:26) ~[classes/:na]... 5 common frames omitted

分析完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28274.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

插入排序

插入排序简单来说 假设数组第一个元素为一个有序序列 然后将后面的无序序列依次与第一个元素比较 更具大小决定待插入元素插入的位置。 、、、 // 插入排序 是吧无序序列中的元素依次插入到有序序列中,一般是从有序序列的尾部开始比较 void InsertSort(int buf[10], int bufsi…

删除字符串中与另一个字符串中的相同字母的自定义函数

#include <stdio.h> /********************************************************************* 函数名称: str_DestDel* 函数功能: 删除一个字符串中与另一个字符串中的相同字母并且不区分大小写* 函数参数:* @strA 需要操作的字符串* @strB 作为参考的字符串…

SwiftUI Text 文字处理

代码// // ContentView.swift // SwiftUIText // // Created by CHEN Hao on 2024/5/6. //import SwiftUIstruct ContentView: View {var body: some View {VStack{Text("Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by…

情感分词新手实践

Tutorial for Sentiment AnalysisAmazon Full Review 情感分析任务 input: Remark Text output: Sentiment(\(\{-1, 0, 1\}\)) convert to \(\{0, 1, 2\}\) for calculating accuracy Mark: 之前没有用 torch 做过 NLP,因此相当于一个 tutorial 数据准备工作文本分词NLP 需要将…

生活常见物理层接口(除去网线)

生活物理层接口 1.USB接口 秒懂所有USB接口类型,USB接口大全;Type-A、Type-B、Type-C、miniUSB、microUSB区分-知乎追风少年上图漏掉了苹果的lightning接口,又叫闪电接口USB-A全称USB Type-A口,俗称USB接口是最常见的接口,如下图左侧接口内部舌头非蓝色的是USB2.0,右侧蓝…

测试分类

单元测试:针对程序的最小单元来进行正确性检验的测试工作,包括类、方法等。(严格来说,单元测试只针对【功能点】进行测试,不包括对业务流程正确性的测试) 功能测试/接口测试:测试接口的功能是否正确。【接口,输入输出】 端到端测试:模拟真实用户的请求(客户端--服务端…

Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。 编写程序Hello World! 首先创建存放程序的文件夹,如下图所示:接下来在创建一个文件夹来保存这节要编写的代码。指令:mkdir 3.1接下来我们要设置VIM编辑器的一些配置,比如设置tab的字符数为4、以及设置VIM编辑器的行…

《线性代数的本质》笔记10

10-特征值与特征向量特征向量几何含义:在一次特定的线性变换中没有脱离原本张成空间的向量。特征值即为这个特征向量在这次变换中缩放的比例。 推导: $$ A\vec{v}=\lambda\vec{v} $$ $$(A-\lambda\textit{I})\vec{v}=\vec{0}$$ $$det(A-\lambda\textit{I})=0$$ 但并非所有线…