黑马程序员技术交流社区

标题: 大家帮忙看下这段关于代理的代码,为什么会出现异常呢? [打印本页]

作者: 杜成龙    时间: 2013-9-25 22:40
标题: 大家帮忙看下这段关于代理的代码,为什么会出现异常呢?
请大家帮忙看下,这段代码怎么会出现NullPointerException呢?想不通啊~
  1. package cn.itcast.day3;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. import java.util.Collection;

  7. public class ActiveProxy {
  8. public static void main(String[] args) throws Exception{

  9. Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  10. System.out.println(clazzProxy.getName());

  11. System.out.println("----------begin constructors list----------");

  12. Constructor[] constructors = clazzProxy.getConstructors();
  13. for(Constructor constructor : constructors){
  14. String name = constructor.getName();
  15. StringBuilder sBuilder = new StringBuilder(name);
  16. sBuilder.append('(');
  17. Class[] clazzParams = constructor.getParameterTypes();
  18. for(Class clazzParam : clazzParams){
  19. sBuilder.append(clazzParam.getName()).append(',');
  20. }
  21. if(clazzParams!=null && clazzParams.length != 0)
  22. sBuilder.deleteCharAt(sBuilder.length()-1);
  23. sBuilder.append(')');
  24. System.out.println(sBuilder.toString());
  25. }

  26. System.out.println("----------begin methods list----------");

  27. Method[] methods = clazzProxy.getMethods();
  28. for(Method method : methods){
  29. String name = method.getName();
  30. StringBuilder sBuilder = new StringBuilder(name);
  31. sBuilder.append('(');
  32. Class[] clazzParams = method.getParameterTypes();
  33. for(Class clazzParam : clazzParams){
  34. sBuilder.append(clazzParam.getName()).append(',');
  35. }
  36. if(clazzParams!=null && clazzParams.length != 0)
  37. sBuilder.deleteCharAt(sBuilder.length()-1);
  38. sBuilder.append(')');
  39. System.out.println(sBuilder.toString());
  40. }

  41. System.out.println("----------begin create instance object----------");

  42. Constructor constructor = clazzProxy.getConstructor(InvocationHandler.class);

  43. Collection proxy = (Collection)constructor.newInstance(new InvocationHandler(){

  44. public Object invoke(Object proxy, Method method, Object[] args)
  45. throws Throwable {
  46. return null;
  47. }
  48. });
  49. System.out.println(proxy);
  50. proxy.clear();
  51. }

  52. }
复制代码
运行的结果最后显示NullPointerException异常,这是为什么呢?请大家指教,谢谢!



作者: 梁贺    时间: 2013-9-25 22:47
$Proxy0
----------begin constructors list----------
$Proxy0(java.lang.reflect.InvocationHandler)
----------begin methods list----------
add(java.lang.Object)
hashCode()
clear()
equals(java.lang.Object)
toString()
contains(java.lang.Object)
isEmpty()
addAll(java.util.Collection)
iterator()
size()
toArray([Ljava.lang.Object;)
toArray()
remove(java.lang.Object)
containsAll(java.util.Collection)
removeAll(java.util.Collection)
retainAll(java.util.Collection)
isProxyClass(java.lang.Class)
getProxyClass(java.lang.ClassLoader,[Ljava.lang.Class;)
getInvocationHandler(java.lang.Object)
newProxyInstance(java.lang.ClassLoader,[Ljava.lang.Class;,java.lang.reflect.InvocationHandler)
wait()
wait(long,int)
wait(long)
getClass()
notify()
notifyAll()
----------begin create instance object----------
null


运行结果,没错啊~~
作者: 神之梦    时间: 2013-9-25 22:56
你最后应该还调用其他方法
作者: 暮雨    时间: 2013-9-25 22:56
运行了一下,并没有出现空指针异常,不知道你是怎么弄的,不过最后输出的proxy确实是一个null值,但是如果你不对proxy进行操作的话应该不会出现异常。运行结果图为:

QQ截图20130925225558.gif (14.91 KB, 下载次数: 19)

QQ截图20130925225558.gif

作者: 罗凯健    时间: 2013-9-25 23:01
空指针异常?没有啊 ,倒是打印了一个null。那是因为你的InvocationHandler里面的invoke方法没有写内容直接return null了。
作者: 杜成龙    时间: 2013-9-26 14:57
不知怎么回事,在我的Myeclipse上运行就是报错啊,奇怪了~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2