nc65 远程调用接口报 java.lang.reflect.UndeclaredThrowableException 错误

本文记录了一次在NC65系统中部署补丁遇到的问题及解决过程。通过对前后端调用、JSON解析包、JDK版本等多个方面进行排查,最终通过查看日志定位到具体原因。

在最刚开始的时候只拿到以下相关错误信息

结合同事给出的信息,同样的补丁包,在63可以,在65不行

根据以往经验,猜测可能导致的原因可能有以下几点:

1.前后端调用

2.解析json的包,nc65 对jar包有指定版本,比如json导入的包

3.jdk的版本,home的版本和补丁的版本是否是一致。nc65是1.7的,确认一下调用的类是否是用1.7编译了

4.发的wsdl地址有问题

5.参数名称是否有重复的

6.oa系统的客户端也有可能有影响(在此次事件中由于用soapui测试也有问题所以自动排除)



后百度,这种错误是没有显示的抛出异常,但在代码上加上try catch 也抓不到异常。

由于给出的信息很少,在最刚开始没有想到要调出日志看(此时在这点上进行深刻反省)

后经过以上因素逐一排查了,注释疑似错误代码,多次打补丁等操作,还是报错的绝望之际

终于想起了可以调出home里面的nclog错误日志

后看到详细日志,是前后端调用的原因。



事实证明,每个猜想的判断都要自己去验证,

第一时间记得调日志出来看真的很重要



在调用 Java 接口时出现 `java.lang.reflect.InvocationTargetException` 错误,该错误通常是在使用反射调用方法时,被调用的方法内部抛出异常而引发的。以下为一些可能的解决办法: ### 检查被调用方法的实现 `InvocationTargetException` 只是一个包装异常,真正的异常信息被封装在其内部。可以通过调用 `getCause()` 方法获取实际抛出的异常,从而定位问题。示例代码如下: ```java import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { try { // 获取方法并调用 Class<?> clazz = SomeClass.class; Method method = clazz.getMethod("someMethod"); Object instance = clazz.getDeclaredConstructor().newInstance(); method.invoke(instance); } catch (InvocationTargetException e) { // 获取实际抛出的异常 Throwable cause = e.getCause(); cause.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } class SomeClass { public void someMethod() throws Exception { // 模拟抛出异常 throw new Exception("Something went wrong"); } } ``` 在上述代码中,通过 `e.getCause()` 方法获取了实际抛出的异常,并打印其堆栈信息,这样就能知道具体是哪里出了问题。 ### 检查参数传递 确保在使用反射调用方法时,传递的参数类型和数量与被调用方法的定义一致。例如: ```java import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { try { Class<?> clazz = SomeClass.class; Method method = clazz.getMethod("add", int.class, int.class); Object instance = clazz.getDeclaredConstructor().newInstance(); // 传递正确的参数 Object result = method.invoke(instance, 1, 2); System.out.println(result); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); cause.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } class SomeClass { public int add(int a, int b) { return a + b; } } ``` ### 检查访问权限 如果被调用的方法是私有方法,需要先调用 `setAccessible(true)` 来设置可访问性。示例如下: ```java import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { try { Class<?> clazz = SomeClass.class; Method method = clazz.getDeclaredMethod("privateMethod"); // 设置可访问性 method.setAccessible(true); Object instance = clazz.getDeclaredConstructor().newInstance(); method.invoke(instance); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); cause.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } class SomeClass { private void privateMethod() { System.out.println("This is a private method."); } } ``` ### 检查 SQL 语句中的引号问题 若错误与 SQL 语句有关,像在 SQL 语句里使用了单引号,可尝试将单引号改为双引号。例如: ```sql select t.cid,t.cn, sum(case t.eduId1 when '本科以下' then t.num else 0 end) as "本科以下", sum(case t.eduId1 when '本科' then t.num else 0 end) as "本科", sum(case t.eduId1 when '硕士' then t.num else 0 end) as "硕士"; ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值