JSONUtil InvocationTargetException: null

使用JSONUtil时候报错,一般这时候你检查下自己代码里是不是重写了get或者set

InvocationTargetException 是 Java 中的一个异常,通常在使用反射(Reflection)或动态代理(Dynamic Proxy)时抛出。它表示在调用方法时发生了异常,但具体的异常信息被封装在了 InvocationTargetException 中。要找到根本原因,需要查看封装的异常。

1. 什么是 InvocationTargetException

定义

InvocationTargetException 是一个包装异常,它封装了在调用方法时发生的实际异常。当你使用反射或动态代理调用方法时,如果方法内部抛出了异常,这个异常会被封装在 InvocationTargetException 中。

特点

  • 封装异常InvocationTargetException 包含了一个 cause 属性,表示实际抛出的异常。
  • 常见场景:通常出现在使用反射或动态代理时,例如通过 Method.invoke() 调用方法时。

2. 示例代码

以下是一个使用反射调用方法时抛出 InvocationTargetException 的示例:

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        try {
            // 获取类的实例
            MyClass myObject = new MyClass();

            // 获取方法的引用
            Method method = MyClass.class.getMethod("myMethod");

            // 调用方法
            method.invoke(myObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public void myMethod() {
        // 抛出一个异常
        throw new RuntimeException("Something went wrong");
    }
}

3. 输出结果

运行上述代码时,可能会看到类似以下的输出:

java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at Main.main(Main.java:12)
Caused by: java.lang.RuntimeException: Something went wrong
    at MyClass.myMethod(Main.java:24)
    ... 5 more

4. 如何处理 InvocationTargetException

4.1 获取封装的异常

要找到根本原因,需要获取 InvocationTargetException 中封装的异常。可以通过 getCause() 方法获取实际的异常。

示例代码
try {
    // 获取类的实例
    MyClass myObject = new MyClass();

    // 获取方法的引用
    Method method = MyClass.class.getMethod("myMethod");

    // 调用方法
    method.invoke(myObject);
} catch (InvocationTargetException e) {
    // 获取封装的异常
    Throwable cause = e.getCause();
    if (cause != null) {
        cause.printStackTrace();
    } else {
        e.printStackTrace();
    }
} catch (Exception e) {
    e.printStackTrace();
}

4.2 输出结果

运行上述代码时,会直接打印出实际的异常:

java.lang.RuntimeException: Something went wrong
    at MyClass.myMethod(Main.java:24)

5. 总结

  • InvocationTargetException 是什么:一个包装异常,封装了在调用方法时发生的实际异常。
  • 特点:包含一个 cause 属性,表示实际抛出的异常。
  • 常见场景:使用反射或动态代理时,例如通过 Method.invoke() 调用方法。
  • 处理方法:通过 getCause() 方法获取封装的异常,找到根本原因。