Got unchecked and undeclared exception which called by *** exception: java.lang.NullPointerException

背景:使用dubbo服务调用的时候,服务者端报Got unchecked and undeclared exception which called by xxx.xxx.xxx.xxx service: com.xxx.xxx.UserLoginService, method: Userlogin, exception: java.lang.NullPointerException: null, dubbo version: 2.5.3, current host: 127.0.0.1

详细异常堆栈如下:

ERROR com.alibaba.dubbo.rpc.filter.ExceptionFilter  -  [DUBBO] Got unchecked and undeclared exception which called by xxx.xxx.xxx.xxx service: com.xxx.xxx.UserLoginService, method: UserLogin, exception: java.lang.NullPointerException: null, dubbo version: 2.5.3, current host: 127.0.0.1
java.lang.NullPointerException
        at java.util.Hashtable.put(Hashtable.java:459)
        at org.apache.log4j.MDC.put0(MDC.java:117)
        at org.apache.log4j.MDC.put(MDC.java:72)
        at org.slf4j.impl.Log4jMDCAdapter.put(Log4jMDCAdapter.java:35)
        at org.slf4j.MDC.put(MDC.java:116)
        at com.xxx.service.aop.LogsAspect.initMDC(ReqAspect.java:72)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
        at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)

分析:一开始看到dubbo服务端报的异常,没细看,还以为是服务挂了,上了dubbo-admin控制台确认了一波,消费者跟服务者都正常运行;细看了,异常堆栈里面报 java.lang.NullPointerException,明显是空指针异常,在异常堆栈里找到自己代码出的异常提示at com.xxx.service.aop.LogsAspect.initMDC(ReqAspect.java:72),问题就出在这里,这里主要是切面里为每次请求进来添加一个全局的流水号,内如有一处有坑:

MDC.put(LOGCONFIG.TRACE_LOG_ID, traceLogId);这里使用的slf包是slf4j-api:1.7.5,有一个很致命的坑,这个版本的MDC的put进去的value值不能为null,不然会报 java.lang.NullPointerException,参考链接:https://www.eclipse.org/forums/index.php?t=msg&th=1078299&goto=1734728&#msg_1734728

解决方法:把slf4j-api的依赖包升级为高版本,如:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.26</version>
</dependency>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ect' to 'java.util.ArrayList<java.lang.String>' 未经检查的转换:'java.lang.Object'到'java.util.ArrayList<java.lang.String>' ### 回答2: Unchecked cast: 'java.lang.Object' 的意思是未经检查的强制类型转换,通常会发生在将 Object 类型的对象转换成某个具体类型的对象时。由于 Object 类型是 Java 中的基类,因此可以存放任何类型的对象,但是在实际使用中,需要将它们转换成特定类型才能进行操作。 在 Java 编译器中,对于类型转换的操作会进行类型检查,以确保类型的兼容性和安全性。但是,在某些情况下,编译器无法确定转换操作的安全性,因此会输出类似于 “unchecked cast” 的警告信息。 当我们忽略这些警告信息,直接运行代码时,可能会发生类型转换异常,这是由于在运行时,编译器无法确定类型转换的安全性,而导致的错误。 为了解决这个问题,我们可以使用泛型类型来进行类型转换操作,以减少运行时错误的发生。泛型类型可以确保编译时类型的安全性,并在运行时自动进行类型转换,可以避免类型转换异常等潜在问题。 总之,unchecked cast: 'java.lang.Object' 警告信息提示我们在进行类型转换时应该注意类型的安全性,并采用合适的方式确保程序的正确性。同时,使用泛型类型也可以提高程序的稳定性和可读性。 ### 回答3: 当编写 Java 代码时,我们可能会遇到“unchecked cast: 'java.lang.obj”这样的警告。这个警告表示我们使用了一种未经检查的转换方法将一个对象转换为具体的类型。在运行时,如果实际对象与转换后的对象类型不兼容,可能会导致 ClassCastException 异常。 在 Java 中,我们通常使用两种类型的转换:向上转型和向下转型。向上转型可以将子类对象转换为父类对象,而向下转型则可以将父类转换为子类对象。对于向上转型,它是安全的,因为它不会丢失任何信息。但是,向下转型会丢失信息,因为子类可能有父类没有的属性或方法。 这个警告的存在主要是为了防止在将对象从一种类型转换为另一种类型时出现问题。因此,我们在使用转换时需要格外小心,确保转换是安全的,不会导致运行时异常。同时,我们还可以通过使用 instanceof 关键字来避免这个警告,先判断对象的类型是否与我们需要的类型相同,如果相同再进行转换。 虽然可以通过 @SuppressWarnings("unchecked") 注解来忽略这个警告,但是我们通常不推荐这么做,因为这样会破坏代码的稳健性和可读性。如果我们仍然想忽略这个警告,可以在注解中指定具体的类型,从而将警告限制在某个范围内。 总之,在使用类型转换时,我们应该始终注意安全性,并且避免忽略任何警告,以确保代码的稳定和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值