繁体   English   中英

使用增强的for循环时为什么在此程序中出现空指针异常

[英]Why am I getting null pointer exception in this program when using enhanced for loop

我在selectAllStudent方法中得到一个空指针异常。 当我使用foreach循环但当我使用普通循环时,它工作正常。 请说明原因。 谢谢

驾驶员等级

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

    public static void main(String[] args) {
        Student[] sdb = new Student[2];
        try {
            for (Student s : sdb) {
                s = takeInput();
            }
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
        selectAllStudent(sdb);
    }

    static void selectAllStudent(Student[] sdb) {
        for (Student s : sdb) {
            s.printStudentDetails();               // Getting NullPOinterException here
        }
    }
    public static Student takeInput() throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the details ");
        System.out.print("ROLL      :"); int rollno = Integer.parseInt(in.readLine());
        System.out.print("NAME      :"); String name = in.readLine();
        System.out.print("BRANCH    :"); String branch = in.readLine();
        return (new Student(rollno,name,branch));
    }  
}

学生班

public class Student {

    private int rollno;
    private String name;
    private String branch;

    Student(int rollno, String name, String branch) {
        this.rollno = rollno;
        this.name = name;
        this.branch = branch;
    }

    void printStudentDetails() {
        System.out.println("ROLLNO  :" + rollno);
        System.out.println("NAME    :" + name);
        System.out.println("BRANCH  :" + branch);
        System.out.println("-------------------");
    }
}

您没有在此for循环中为该数组分配新的Student

for (Student s : sdb) {
    s = takeInput();
}

takeInput方法可以正确返回Student ,但是您已将其分配给本地引用s ,而不是数组sdb的元素。 数组的元素保持为null ,并且NullPointerException来自尝试在selectAllStudent方法中的null上调用printStudentDetails

您可以将增强型for循环转换for标准for循环,为Student分配数组访问表达式。

for (int i = 0; i < sdb.length; i++)
{
    sdb[i] = takeInput();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM