A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hanyahui 中级黑马   /  2013-1-2 14:57  /  1751 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String pciName=prop.getProperty("pic"+(x+1));
//用class去加载这个pic子类
Class clazz=Class.forName(pciName);
IPCI p=(IPCI)clazz.newInstance();
mb.usePCI(p);

pci.properties文件的内容
pci1=y13.m1.d2b.SoundCard
pci2=y13.m1.d2b.NetCard

为什么总是报异常呢?
Exception in thread "main" java.lang.NullPointerException
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at y13.m1.d2b.ReflectTest.main(ReflectTest.java:33)

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
Class clazz=Class.forName(pciName);
IPCI p=(IPCI)clazz.newInstance();
你这里错了,中间缺少一步:你都没有获取构造函数,怎么创建对象呢?而且newInstance()方法是哪个类的,你要搞清楚,所以你会空指针异常,因为你对象都不存在,你如何调用?
解决方式如下:
第2步:Constructor con = clazz.getConstructor();//获取空参的构造函数
第3步:Object obj = con.newInstance();   //直接Object接收就行了,如果要实用特殊方法再转,但是就需要导包了。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
肖志锋 发表于 2013-1-2 15:07
Class clazz=Class.forName(pciName);
IPCI p=(IPCI)clazz.newInstance();
你这里错了,中间缺少一步:你 ...

这是照老毕的写的,是加载配置文件里的子类,再说这里是用的默认构造方法啊
回复 使用道具 举报
。。那只能你自己去对照代码了,是有导包吗?你的强制类型转换,需要导包的。因为看不到所有的代码,我也只能猜测。
回复 使用道具 举报
肖志锋 发表于 2013-1-2 17:39
。。那只能你自己去对照代码了,是有导包吗?你的强制类型转换,需要导包的。因为看不到所有的代码,我也只 ...

不用吧  就在同一个包中

你看看老毕的Code\day28e\src\cn\itcast\reflect\test      
这些代码 没有视频
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马