ArrayList的Java While循环可以';无法获取数组中的数据

ArrayList的Java While循环可以';无法获取数组中的数据,java,Java,我尝试使用菜单循环,而不是当我完成第一个选项时,我想在选项2中获取数据。 无法获取,这是一个错误 线程“main”java.lang.IndexOutOfBoundsException中的异常:索引0超出长度0的界限 位于java.base/jdk.internal.util.premissions.outOfBounds(premissions.java:64) 位于java.base/jdk.internal.util.premissions.outOfBoundsCheckIndex(pr

我尝试使用菜单循环,而不是当我完成第一个选项时,我想在选项2中获取数据。 无法获取,这是一个错误

线程“main”java.lang.IndexOutOfBoundsException中的异常:索引0超出长度0的界限 位于java.base/jdk.internal.util.premissions.outOfBounds(premissions.java:64) 位于java.base/jdk.internal.util.premissions.outOfBoundsCheckIndex(premissions.java:70) 位于java.base/jdk.internal.util.premissions.checkIndex(premissions.java:248) 位于java.base/java.util.Objects.checkIndex(Objects.java:373) 位于java.base/java.util.ArrayList.get(ArrayList.java:425) 在craitid_19.main(craitid-19.java:38)

import java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
克雷蒂德19级{
公共静态void main(字符串[]args){
while(true){
System.out.println(“1-插入”);
System.out.println(“2-编辑”);
System.out.println(“3视图”);
System.out.println(“4-退出”);
扫描仪输入=新扫描仪(System.in);
int choice=input.nextInt();
已感染患者=新感染();
开关(选择){
案例1:
系统输出打印(“ID=”);
int id=input.nextInt();
System.out.print(“name=”);
String name=input.next();
系统输出打印(“age=”);
String age=input.next();
系统输出打印(“性别=”);
字符串性别=input.next();
系统输出打印(“日期=”);
字符串日期=input.next();
系统输出打印(“省=”);
字符串province=input.next();
System.out.print(“infectby=”);
字符串infectby=input.next();
患者。儿童。添加(新正常人(id、姓名、年龄、性别、日期、省份、传染人));
System.out.print(patient.toString());
继续;
案例2:
System.out.println(“插入ID”);
System.out.print(patient.children.get(0));
案例4:
System.out.println(“退出程序…”);
系统出口(0);
打破
违约:
System.out.println(“这不是一个有效的菜单选项!请选择另一个”);
打破
}
}
}
}
类感染{
公共int id;
公共字符串名称;
公共字符串年龄;
社会性别;
公共字符串日期;
公营省;
公共字符串被感染;
公共字符串类型;
public List children=new ArrayList();
公众受感染(){
}
@凌驾
公共字符串toString()
{
String returnString=id+(“,”)+name+(“,”)+age+(“,”)+gender+(“,”)+date+(“,”)+province+(“,”)+infectby+(“,”)+type+System.lineSeparator();
适用于(受感染儿童:儿童)
returnString=child.toString()+System.lineSeparator();
返回字符串;
}
}
类正常扩展已感染{
公共正常值(整数id、字符串名称、字符串年龄、字符串性别、字符串日期、字符串省、字符串感染者){
type=“1”;
this.id=id;
this.name=名称;
这个。年龄=年龄;
这个。性别=性别;
this.date=日期;
这个省=省;
this.infectby=infectby;
}
}

您的问题是您在while循环中创建了受感染的患者。这意味着您将覆盖每次回答菜单时创建的数据。当您试图获取0元素时,该错误实际上表示patient.children列表为空。因此,我建议:

  • 将患者对象的初始化移出while循环(只需将其放在while之前)

  • 在尝试从列表中读取数据之前,请检查列表是否为空

  • 对类使用Java命名约定(它们应该从大写字母开始-Infected,而不是Infected等等)-这将使代码更具可读性

  • 首先,您必须替换
    继续通过
    中断然后,在第4行和第5行之间,您必须添加以下内容:

    infected patient = new infected();
    
    如果您想在每次循环重复时调用类的构造函数,则只需调用一次类和类的构造函数

    infected patient,
    
    在第13行中,您将替换您的:

    patient = new infected();
    
    只调用一次构造函数与每次循环重复调用构造函数有什么区别?

    • 在第一种情况下,当您添加患者时,它将一直保留,直到您关闭程序
    • 在第二种情况下,每次循环重复,您之前添加的患者都将丢失
    明智地选择。
    您还应该使用Java名称约定,类名称的第一个字母必须是大写。

    您是否使用了
    continue
    而不是
    break
    ?另外,您在
    案例2中没有
    中断
    在主方法之外。它是一个局部变量,在每个循环中都被实例化。是的,我忘了。在案例2中,我想检查ArrayList中的数据,但在案例2中加入break之前,它也有相同的错误。谢谢你,哈哈,我解决了这个错误。
    
    patient = new infected();