Java 当使用增强for循环时,为什么在这个程序中出现空指针异常

Java 当使用增强for循环时,为什么在这个程序中出现空指针异常,java,nullpointerexception,Java,Nullpointerexception,我在selectAllStudent方法中遇到空指针异常。 当我使用foreach循环时,但当我使用普通循环时,它工作正常。 请解释原因。多谢各位 驾驶员等级 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test { public static void main(String[] args) { St

我在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("-------------------");
    }
}
学生班

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("-------------------");
    }
}

您没有将新的
Student
分配给
for
循环中的数组

for (Student s : sdb) {
    s = takeInput();
}
takeInput
方法正确返回
Student
,但您已将其分配给本地引用
s
,而不是作为数组
sdb
中的元素。数组的元素保持为
null
,而
NullPointerException
来自尝试在
selectAllStudent
方法中调用
printStudentDetails

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

for (int i = 0; i < sdb.length; i++)
{
    sdb[i] = takeInput();
}
for(int i=0;i
您没有为此
for
循环中的数组分配新的
学生

for (Student s : sdb) {
    s = takeInput();
}
takeInput
方法正确返回
Student
,但您已将其分配给本地引用
s
,而不是作为数组
sdb
中的元素。数组的元素保持为
null
,而
NullPointerException
来自尝试在
selectAllStudent
方法中调用
printStudentDetails

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

for (int i = 0; i < sdb.length; i++)
{
    sdb[i] = takeInput();
}
for(int i=0;i
您没有为此
for
循环中的数组分配新的
学生

for (Student s : sdb) {
    s = takeInput();
}
takeInput
方法正确返回
Student
,但您已将其分配给本地引用
s
,而不是作为数组
sdb
中的元素。数组的元素保持为
null
,而
NullPointerException
来自尝试在
selectAllStudent
方法中调用
printStudentDetails

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

for (int i = 0; i < sdb.length; i++)
{
    sdb[i] = takeInput();
}
for(int i=0;i
您没有为此
for
循环中的数组分配新的
学生

for (Student s : sdb) {
    s = takeInput();
}
takeInput
方法正确返回
Student
,但您已将其分配给本地引用
s
,而不是作为数组
sdb
中的元素。数组的元素保持为
null
,而
NullPointerException
来自尝试在
selectAllStudent
方法中调用
printStudentDetails

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

for (int i = 0; i < sdb.length; i++)
{
    sdb[i] = takeInput();
}
for(int i=0;i
可能重复的“我知道什么是空指针异常”,但我不确定为什么我会在这里得到空指针异常如果我使用的是普通for循环,我不会得到异常,但当我使用for每个循环时,我会得到异常。@Rohitharma:如果你知道空指针异常是什么,您应该能够识别哪个引用为null。然后,您可能会有一个关于它为什么为空的问题,但这不是同一个问题。此外,请阅读说明如何格式化代码的帮助-它不需要引用(
>…
)可能重复“我知道什么是空指针异常”,但我不确定为什么我会在这里得到空指针异常如果我使用的是普通for循环,我不会得到异常,但当我使用for每个循环时,我会得到异常。@RohitSharma:如果你知道空指针异常是什么,您应该能够识别哪个引用为null。然后,您可能会有一个关于它为什么为空的问题,但这不是同一个问题。此外,请阅读说明如何格式化代码的帮助-它不需要引用(
>…
)可能重复“我知道什么是空指针异常”,但我不确定为什么我会在这里得到空指针异常如果我使用的是普通for循环,我不会得到异常,但当我使用for每个循环时,我会得到异常。@RohitSharma:如果你知道空指针异常是什么,您应该能够识别哪个引用为null。然后,您可能会有一个关于它为什么为空的问题,但这不是同一个问题。此外,请阅读说明如何格式化代码的帮助-它不需要引用(
>…
)可能重复“我知道什么是空指针异常”,但我不确定为什么我会在这里得到空指针异常如果我使用的是普通for循环,我不会得到异常,但当我使用for每个循环时,我会得到异常。@RohitSharma:如果你知道空指针异常是什么,您应该能够识别哪个引用为null。然后,您可能会有一个关于它为什么为null的问题,但这不是同一个问题。此外,请阅读说明如何格式化代码的帮助-引用(
)没有完成。我在正常的for循环中没有收到任何错误。使用增强for循环有什么方法可以做到这一点吗?没有,因为
s
不是数组元素。您可以更改
s
引用的内容,但这不会更改数组引用的内容。这意味着使用增强型f只能访问值