黑马程序员技术交流社区

标题: 这个为啥空指针了? [打印本页]

作者: zealler    时间: 2017-7-1 17:29
标题: 这个为啥空指针了?
求助!


作者: 785026612    时间: 2017-7-1 17:59
你new的student数组里面没有存student对象,遍历得到的是null,用null调用方法会空指针

作者: zealler    时间: 2017-7-1 18:13
785026612 发表于 2017-7-1 17:59
你new的student数组里面没有存student对象,遍历得到的是null,用null调用方法会空指针
...

那不用new赋值怎么给sarr赋值??

作者: zealler    时间: 2017-7-1 18:14
785026612 发表于 2017-7-1 17:59
你new的student数组里面没有存student对象,遍历得到的是null,用null调用方法会空指针
...

有没有更改建议,老哥

作者: zealler    时间: 2017-7-1 18:17
785026612 发表于 2017-7-1 17:59
你new的student数组里面没有存student对象,遍历得到的是null,用null调用方法会空指针
...

老哥我30行是想用有参构造传入值

作者: zealler    时间: 2017-7-1 18:18
785026612 发表于 2017-7-1 17:59
你new的student数组里面没有存student对象,遍历得到的是null,用null调用方法会空指针
...

30行用有参构造会不会有问题


作者: QQ1002730074    时间: 2017-7-1 20:07
sarr[i]可是值啊,不是你new的对象的地址值

作者: zealler    时间: 2017-7-1 20:51
QQ1002730074 发表于 2017-7-1 20:07
sarr可是值啊,不是你new的对象的地址值

我认为student类数组中的一个元素应该是一个student类型的对象,这种想法是错误的吗?

作者: QQ1002730074    时间: 2017-7-1 20:56
zealler 发表于 2017-7-1 20:51
我认为student类数组中的一个元素应该是一个student类型的对象,这种想法是错误的吗?
...

我还在纳闷呢,你new的是Student数组?类作为引用数据类型?这点,我还没看到,我刚看完第9天的。你是在上课?

作者: QQ1002730074    时间: 2017-7-1 21:35
zealler 发表于 2017-7-1 20:51
我认为student类数组中的一个元素应该是一个student类型的对象,这种想法是错误的吗?
...

看我这个可以,代码给你:
public static void main(String[] args) {
        Scanner sc = new Scanner( System.in);
       
        Student[] sarr = new Student[3];
        Student s = new Student();
       
        for (int i = 0; i < sarr.length; i++) {
               
                s.setName(sc.nextLine());
                String a = s.getName();
                sarr = new Student(a);
               
                s.setAge(sc.nextInt());
                int b = s.getAge();
                sarr = new Student(b);
        }
       
        for (int i = 0; i < sarr.length; i++) {
                 
                System.out.println("姓名: "+ sarr.getName() + "年龄:" + sarr.getAge());
               
        }
        }
}
class Student{
        private String name;
        private int age;
       
        public Student(){}                                                //空参构造
       
        public Student(String name) {                        //有参构造
                this.name = name;
        }
        public Student(int age){
                this.age = age;
        }
       
       
        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;
        }       
}
作者: aaa12344cs    时间: 2017-7-1 21:39
个人理解:引用对象数组和基本数据类型数组不同,不能直接引用。必须单独为每个数组元素进行初始化。要不就报空指针。因为你new student[3] 只有数组的地址。数组中的元素就是你说的Student对象(想法正确)没有内存,全是NULL。  理解了就知道怎么解决空指针了?
作者: QQ1002730074    时间: 2017-7-1 22:13
QQ1002730074 发表于 2017-7-1 21:35
看我这个可以,代码给你:
public static void main(String[] args) {
        Scanner sc = new Scanner( Syste ...

额。也不行
作者: zealler    时间: 2017-7-1 22:15
aaa12344cs 发表于 2017-7-1 21:39
个人理解:引用对象数组和基本数据类型数组不同,不能直接引用。必须单独为每个数组元素进行初始化。要不就 ...

老哥我有个新想法


作者: QQ1002730074    时间: 2017-7-1 22:20
学到知识了

作者: QQ1002730074    时间: 2017-7-1 22:40
对象数组必须单独给每一个要创建的对象赋予内存,针对这个问题,也就是要使sarr[i]不为空指针,就必须在创建对象数组之后先逐一给对象数组new一个Student对象,也就是在堆内存中创建三个Student对象并把三个对象的地址值逐一给sarr[i];
楼主的这个方法是创建一个对象,动态初始化后的对象地址直接给了sarr[i];分析的对么?

作者: zealler    时间: 2017-7-1 22:46
QQ1002730074 发表于 2017-7-1 22:40
对象数组必须单独给每一个要创建的对象赋予内存,针对这个问题,也就是要使sarr[i]不为空指针,就必须在 ...

过两天再回来看看,现在不太懂

作者: zealler    时间: 2017-7-1 22:48
QQ1002730074 发表于 2017-7-1 22:40
对象数组必须单独给每一个要创建的对象赋予内存,针对这个问题,也就是要使sarr[i]不为空指针,就必须在 ...

你的意思是说,每次循环都要new一个student?

作者: zealler    时间: 2017-7-1 22:50
QQ1002730074 发表于 2017-7-1 22:40
对象数组必须单独给每一个要创建的对象赋予内存,针对这个问题,也就是要使sarr[i]不为空指针,就必须在 ...

可以!


作者: QQ1002730074    时间: 2017-7-1 22:52
zealler 发表于 2017-7-1 22:50
可以!

这个只是看那哥们说得要单独去分配内存,我才展开思路的,这个我确实没看到呢,才看到继承,

作者: kang1027    时间: 2017-7-1 23:05
好好搬砖,学什么java

作者: zealler    时间: 2017-7-1 23:07
kang1027 发表于 2017-7-1 23:05
好好搬砖,学什么java

工地不适合我


作者: ruxi    时间: 2017-7-2 00:12
冒泡  好好学java

作者: IceLoveInFire丶    时间: 2017-7-2 00:16
你只是创建了数组,数组里面三个对象默认是null,你用null去调用方法肯定空指针

作者: 南山南    时间: 2017-7-2 01:02
前面用变量接收再用构造赋值。。

作者: Sherolock    时间: 2017-7-2 03:08
我觉得,根本问题是你不清楚,构造方法是什么时候调用,在引用数据类型(也就是所说的对象)创建的时候,jvm会自动调用构造方法,也就是说每出现一个new,就会调用一次构造方法,而对于set或者get方法(没有用静态修饰),是属于对象的,也就是说,在对象存在以后才会调用set get方法,这就有了先后的顺序,构造方法的调用一定是在成员方法之前。你在创建Student数组时,数组元素如果不是new创建,那么会自动赋值为null。本人也才开始学习java,才疏学浅,如果有说错的地方,欢迎指出。

作者: newu    时间: 2017-7-2 08:02
谢谢分享 赞一个

作者: zealler    时间: 2017-7-2 12:35
IceLoveInFire丶 发表于 2017-7-2 00:16
你只是创建了数组,数组里面三个对象默认是null,你用null去调用方法肯定空指针
...

所以循环里面开头加一个Student sarr=new Student ()就行了吧,声明他是student类对象

作者: 猫头鹰true    时间: 2017-7-8 18:51
你要在上一个循环中就添加到集合里面去





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