我正在做功课,我卡在一个问题上。我是java的新手。你可以帮我吗?[复制]

I am doing my homework and I stuck in one question. I am new to java. can you help me? [duplicate]

提问人:Lekh Raj Awasthi 提问时间:12/23/2021 最后编辑:Lekh Raj Awasthi 更新时间:12/23/2021 访问量:207

问:

问题是:

创建一个具有属性名称、年龄和性别的班级人员。创建一个 person 数组以保存 10 个人实例。显示存储在数组中 person 实例上的信息。

我不确定这个问题说了什么,但我试过了,错误是这样的:

线程“main”中的异常 java.lang.NullPointerException 在 instance.main(instance.java:29)

这是我的代码:

import java.util.Scanner;
class person{
    String name= new String();
    int age;
    String gender= new String();
    void setInfo(String Name, int Age, String Gender){
        name= Name;
        age=Age;
        gender=Gender;
    }
    void showInfo(){
        System.out.println(name+" "+ age+" "+gender);
    }
}

public class instance {
    public static void main(String[] args) { 
        Scanner sc= new Scanner(System.in);
        String name= new String();
        int age;
        String gender= new String();
        person obj[]= new person[10];
       
        System.out.println("Enter Name age and gender of 10 persons");
        for(int i=0; i<obj.length; i++)
        { 
            name=sc.nextLine();
            age=sc.nextInt();
            gender=sc.nextLine();
            obj[i].setInfo(name, age, gender);
            
        }
        for(int i=0; i<obj.length; i++){
        obj[i].showInfo();
        }
    }
}
Java 数组 对象 nullPointerException inputMismatchException

评论

3赞 Eran 12/23/2021
person obj[]= new person[10];创建一个包含 10 个元素的数组,这些元素可以保存实例,但这些元素初始化为 。因此为 null,您应该在调用personnullobj[i]obj[i] = new person();obj[i].setInfo(name, age, gender);
0赞 Karl Knechtel 12/23/2021
欢迎使用 Stack Overflow。请阅读如何提问meta.stackoverflow.com/questions/334822 以及 meta.stackoverflow.com/questions/284236ericlippert.com/2014/03/05/how-to-debug-small-programs
0赞 Karl Knechtel 12/23/2021
stackoverflow.com/questions/218384/...回答了你的问题吗?stackoverflow.com/questions/1922677/ 怎么样......
1赞 GhostCat 12/23/2021
提示:问题标题是人们首先看到的关于您的问题的内容。很明显,你在这里是因为你想让别人帮助你。没有必要把它放在问题标题中。环顾四周,看看赞成的问题是如何措辞的:围绕技术问题提出精确的要求。
1赞 GhostCat 12/23/2021
最后:了解 Java 中的构造函数是什么。而不是创建一个对象,然后调用一个方法,如...你应该有一个接受所需参数的构造函数,这样你就可以去new()setInfo()Person x = new Person(name, age, gender)

答:

2赞 임정묵 12/23/2021 #1

您需要实例化数组中的类。

for (int i = 0; i < obj.length; i++) {
    name = sc.nextLine();
    age = sc.nextInt();
    gender = sc.nextLine();

    //see section below
    obj[i] = new person();
    
    obj[i].setInfo(name, age, gender);
}

评论

0赞 Lekh Raj Awasthi 12/23/2021
谢谢删除了错误,但它只接受 20 个输入,即姓名和年龄,而不是 30 个输入。为什么?我的输入Claire 25 母插孔,错误是:线程“main”java.util.InputMismatchException 中的异常
0赞 임정묵 12/23/2021
是否必须逐行输入输入值?我不太明白这个问题,但考虑到你提到了 30 个......我认为您可以按如下方式更改此部分。年龄 = sc.nextInt();-->age = Integer.parseInt(sc.nextLine());
1赞 Lekh Raj Awasthi 12/23/2021
成功了。我们的老师没有这么说,或者他没有到达那里。谢谢。
0赞 user16123931 12/23/2021 #2
    static class person {
            String name= new String();
            int age;
            String gender= new String();

            // Constructor
            person(String Name, int Age, String Gender) {
                this.name = Name;
                this.age = Age;
                this.gender = Gender;
            }
    
            void setInfo(String Name, int Age, String Gender){
                name= Name;
                age=Age;
                gender=Gender;
            }
            void showInfo(){
                System.out.println(name+" "+ age+" "+gender);
            }
        }

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String name = new String();
        int age;
        String gender = new String();
        person[] obj = new person[10];

        for (int i = 0; i < obj.length; i++) {
            name = sc.next();
            age = sc.nextInt();
            gender = sc.next();
            //Initialize a new person object and assign its values and the add it to the array.
            person personObj = new person(name, age, gender); // This is where a constructor is used.
            obj[i] = personObj;
        }
        for (int i = 0; i < obj.length; i++) {
            obj[i].showInfo();
        }
    }

我已经尝试了您的代码并发现了问题所在。

问题在于,每当创建类对象时,都必须创建一个构造函数来更新该类中变量的任何值。如果在同一类中创建的类 和 将在方法中使用,则使该类为静态。main

使用 Scanner 读取输入时,您使用了导致 .所以,只需使用sc.nextLine();InputMisMatchExceptionsc.next();

评论

0赞 Lekh Raj Awasthi 12/23/2021
谢谢,但没有任何变化 与之前的答案相同的错误。它忽视了对性别的投入。
0赞 12/23/2021
这个答案的更新是否清除了你的作业?:)