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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹文涛 黑马帝   /  2011-9-14 12:22  /  2140 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨天练习反射还很正常 今天重新写了一下就不行了[code=java]public class FieldDemo02 {
        public static void main(String[] args) throws Exception {
                Object per = null;
                Class<?> c = Class.forName("com.huawei.interview.Person");
                per = c.newInstance();
                Field[] field = per.getClass().getFields();
                for(Field fi:field){
                        if(fi.getType()== String.class){
                                String oldValue = (String)fi.get(per);
                                System.out.println(oldValue);
                                String newValue = oldValue.replace('d','a');
                                fi.set(per, newValue);
                        }
                }
                Method met = c.getMethod("toString");
                System.out.println(met.invoke(per));
        }
}[/code]报错:
null
Exception in thread "main" java.lang.NullPointerException
        at com.huawei.interview.FieldDemo02.main(FieldDemo02.java:16)



9.14 14:36
好吧 我找到问题的所在了 我在Person里定义了一个public static String EXEC;
所以报错了 因为常量 的值不能改变 谢谢大家!
[ 本帖最后由 曹文涛 于 2011-09-14  14:37 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

8 个回复

倒序浏览
黑马网友  发表于 2011-9-14 12:28:43
沙发
自己现在没条件测试,大概看了下,会不会是[code]Method met = c.getMethod("toString"); [/code]出了问题
我记得应该是[code]Method met = c.getClass.getMethod("toString"); [/code]
回复 使用道具 举报
黑马网友  发表于 2011-9-14 13:54:36
藤椅
应该是Method met=per.getClass().getMethod("toString");
回复 使用道具 举报
黑马网友  发表于 2011-9-14 14:23:51
板凳
错在此[code]Class<?> c = Class.forName("com.huawei.interview.Person");
05.               
per = c.newInstance(); [/code]你这个Person类有问题,你提供一个无参的构造方法就行。
因为在c  newinstance时会去找无参的构造方法,必须自行提供。
回复 使用道具 举报
我只是改了你的Class.forName里面的参数,改成我自己建的类,运行没有问题
[ 本帖最后由 史卫平 于 2011-09-14  14:35 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-14 14:33:53
地板
把15 16 两行 // 掉 也一样 报错的是 第11行  9行oldValue 的值为空 所以第10输出的时候 会输出个null
现在我就不懂它为什么为null了……空构造一直有
回复 使用道具 举报
黑马网友  发表于 2011-9-14 14:50:31
7#
你在Persion里初始化了各个属性没有。 你能执行到9 10行 说明你的field是有的,但是在输出值的时候是null,就说明你的field在persion里本来是没值。

如果你的persion的属性里有值的话,看看属性是否是pubilc的。默认的很私有的是不能提取到值的。
回复 使用道具 举报
黑马网友  发表于 2011-9-14 14:53:35
8#
不知道你理解没有,你的程序我做了各种测试,如我上面那段话。
Stutend[code]package com.itheima.test;

public class Student {
        public String name;
         public int age;
         public float score;
       
       
        public Student(){
                name = "默认人物";
                age = 20;
                score = 520;
        }
        public Student(String name, int age, float score) {
                this.name = name;
                this.age = age;
                this.score = score;
        }
       
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public float getScore() {
                return score;
        }
        public void setScore(float score) {
                this.score = score;
        }
       
        public String toString() {
                return name + "\t" + age + "\t" + score;
        }
}[/code][code]import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class FieldDemo02 {

        public static void main(String[] args) throws Exception {

                Object per = null;

                Class<?> c = Class.forName("com.itheima.test.Student");

                per = c.newInstance();

                Field[] field = per.getClass().getFields();

                System.out.println(field.length);
                for (Field fi : field) {
                        Object oldValue = fi.get(per);
                        System.out.println(oldValue);

                }

                Method met = c.getMethod("toString");
                System.out.println(met.invoke(per));

        }
       
        private static <T> void fillmethod(T[] a,T obj){
                              
                for(int i=0;i<a.length;i++){
                                      
                a[i]=obj;
                             
                }
        }
       
}[/code]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 辛苦啦!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-14 21:44:00
9#

回复 楼主 的帖子

public static String EXEC;
这不是常量吧,你的错误只是没有EXEC赋值
所以才有null异常

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞同!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马