qq_39342405 2017-08-08 09:30 采纳率: 0%
浏览 2714

java 动态代理报 空指针异常

在学习动态代理时 遇到一个莫名奇妙的异常 还望各位大佬能提点一下。。代码如下:
接口:
public interface UserService {
public int saveUser(String dosth);
}
委托类:
public class UserServiceImpl implements UserService {
@Override
public int saveUser(String dosth) {
System.out.println(dosth);
return 1;
}
}
测试main方法:
public static void main(String[] args) {
UserService us = new UserServiceImpl();
UserService usp = (UserService) Proxy.newProxyInstance(us.getClass().getClassLoader(), us.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//
System.out.println("before...");
Object obj = method.invoke(us, args);
System.out.println(obj);
System.out.println("after...");
return obj;
}
});
System.out.println(usp.saveUser("租房子"));
}

此时代码没什么问题:
运行结果: before...
租房子
1
after...
1
可是我把 invoke 方法里的 return obj 改为 return null 时 测试时会报空指针异常:
运行结果如下:
before...
租房子
1
after...
Exception in thread "main" java.lang.NullPointerException
at com.sun.proxy.$Proxy0.saveUser(Unknown Source)
at dynamicProxy.impl.dynamicProxy.main(dynamicProxy.java:27)

不是很理解 为什么感觉是 invoke 方法被执行了以后 还报我的代理对象空指针??搞了半天了~~~

  • 写回答

1条回答 默认 最新

  • zhi_cike 2017-08-11 08:38
    关注

    代理类中的代码,有返回值的话会有类型强转操作将null转为Integer再转为int,转换实际执行代码为((Integer)null).intValue(),所以会报控制针
    如下为反编译代理类得到的方法
    public final int saveUser(String var1) throws {
    try {
    return ((Integer)super.h.invoke(this, m3, new Object[]{var1})).intValue();
    } catch (RuntimeException | Error var3) {
    throw var3;
    } catch (Throwable var4) {
    throw new UndeclaredThrowableException(var4);
    }
    }

    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗