黑马程序员技术交流社区

标题: 关于空指向异常 [打印本页]

作者: 曹文涛    时间: 2011-9-14 12:22
标题: 关于空指向异常
昨天练习反射还很正常 今天重新写了一下就不行了[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 编辑 ]
作者: 匿名    时间: 2011-9-14 12:28
自己现在没条件测试,大概看了下,会不会是[code]Method met = c.getMethod("toString"); [/code]出了问题
我记得应该是[code]Method met = c.getClass.getMethod("toString"); [/code]
作者: 匿名    时间: 2011-9-14 13:54
应该是Method met=per.getClass().getMethod("toString");
作者: 匿名    时间: 2011-9-14 14:23
错在此[code]Class<?> c = Class.forName("com.huawei.interview.Person");
05.               
per = c.newInstance(); [/code]你这个Person类有问题,你提供一个无参的构造方法就行。
因为在c  newinstance时会去找无参的构造方法,必须自行提供。
作者: 史卫平    时间: 2011-9-14 14:31
我只是改了你的Class.forName里面的参数,改成我自己建的类,运行没有问题
[ 本帖最后由 史卫平 于 2011-09-14  14:35 编辑 ]
作者: 匿名    时间: 2011-9-14 14:33
把15 16 两行 // 掉 也一样 报错的是 第11行  9行oldValue 的值为空 所以第10输出的时候 会输出个null
现在我就不懂它为什么为null了……空构造一直有
作者: 匿名    时间: 2011-9-14 14:50
你在Persion里初始化了各个属性没有。 你能执行到9 10行 说明你的field是有的,但是在输出值的时候是null,就说明你的field在persion里本来是没值。

如果你的persion的属性里有值的话,看看属性是否是pubilc的。默认的很私有的是不能提取到值的。
作者: 匿名    时间: 2011-9-14 14:53
不知道你理解没有,你的程序我做了各种测试,如我上面那段话。
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]
作者: 匿名    时间: 2011-9-14 21:44
标题: 回复 楼主 的帖子
public static String EXEC;
这不是常量吧,你的错误只是没有EXEC赋值
所以才有null异常




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