【问题标题】:Message keeps repeating through every element of array Java消息在数组 Java 的每个元素中不断重复
【发布时间】:2022-01-17 20:50:26
【问题描述】:

我是 Java 新手,我有一个 Passenger 构造函数类的对象数组。如果正在创建乘客对象并且插入的出生日期不是我在下面指定的正确格式,我正在尝试显示错误消息。问题是当我只有一个出生日期格式不正确时,错误消息在整个数组中不断重复。

这是我的主要课程:

public class IPOO_P2 {

    private static Passenger[] passengers = new Passenger[10];

    public static void main(String[] args) {

        SubwayManager man1 = new SubwayManager(passengers);

        for (int i = 0; i < passengers.length; i++) {

            passengers[i] = new Passenger("nomee", "12", "2011-10-02");
            passengers[i] = new Passenger("nomee2", "1", "1957-10-02");
            passengers[i] = new Passenger("nomee2", "0", "19-101-02");
            passengers[i] = man1.createPassenger("name", "3", "1997-10-02");
            passengers[i] = man1.createPassenger("name", "3", "1997-10-02");
        }
    }
}

乘客类:

public class Passenger {

    private String name;
    private String nif;
    private String birthDate;
    private Trip[] tripsLog;
    private boolean student;

    public Passenger(String name, String nif, String birthDate) {
        if (name != null || name != "") {

           if(isDateValid(birthDate)) {
               
                this.name = name;
                this.nif = nif;
                this.birthDate = birthDate;
                this.student = false;
                this.tripsLog = new Trip[10];
                
            } 
           else{ 
               System.out.println("Birth Date formatt should be: yyyy-MM-dd");
           }
        }
    }

    public boolean isDateValid(String bDate) {

        if(bDate != null){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        try {
            LocalDate.parse(bDate, formatter);
            return true;
        } catch (DateTimeParseException e) {

            return false;
        }
    }return false;
    }

【问题讨论】:

  • 我认为您不需要在 main 中使用 for 循环。输入数字:passengers[0] = new Passenger("nomee", "12", "2011-10-02");
  • 您需要向我们展示SubwayManager 代码。 passengers[i] = new Passenger("nomee2", "0", "19-101-02"); 是您插入数组的唯一值,我怀疑它后面的 2 行对数组内容没有任何影响,而前面的 2 行无关紧要,因为 passengers[i] = new Passenger("nomee2", "0", "19-101-02"); 是在索引处插入的一、

标签: java arrays


【解决方案1】:

问题在于您的 For 循环重复执行构造 Passenger 对象的代码 10 次。因此,如果Passenger 构造函数中有一个错误日期,您将看到相同的错误消息显示 10 次。

从创建Passenger 对象的代码中删除For loop 并单独创建Passenger 对象,如下所示:

            passengers[0] = new Passenger("nomee", "12", "2011-10-02");
            passengers[1] = new Passenger("nomee2", "1", "1957-10-02");
            passengers[2] = new Passenger("nomee2", "0", "19-101-02");
            passengers[3] = man1.createPassenger("name", "3", "1997-10-02");
            passengers[4] = man1.createPassenger("name", "3", "1997-10-02");

这样,对于提供给Passenger 构造函数的每个错误日期,您只会看到一次错误消息。

【讨论】:

  • 非常感谢,这解决了我的问题!
【解决方案2】:

不知道你想在这里做什么

passengers[i] = new Passenger("nomee", "12", "2011-10-02");
passengers[i] = new Passenger("nomee2", "1", "1957-10-02");
passengers[i] = new Passenger("nomee2", "0", "19-101-02");
passengers[i] = man1.createPassenger("name", "3", "1997-10-02");
passengers[i] = man1.createPassenger("name", "3", "1997-10-02");

您将在每个循环中覆盖乘客数组中的第 i 个元素 4 次。

这个分配给出了一个DateTimeParseException,因此每次迭代都会打印相同的内容:

passengers[i] = new Passenger("nomee2", "0", "19-101-02");

【讨论】:

    【解决方案3】:

    在这个区块中:

            for (int i = 0; i < passengers.length; i++) {
    
                passengers[i] = new Passenger("nomee", "12", "2011-10-02");
                passengers[i] = new Passenger("nomee2", "1", "1957-10-02");
                passengers[i] = new Passenger("nomee2", "0", "19-101-02");
                passengers[i] = man1.createPassenger("name", "3", "1997-10-02");
                passengers[i] = man1.createPassenger("name", "3", "1997-10-02");
            }
    

    您正在为每个循环步骤运行所有行。我的意思是,如果数组有 10 个元素,并且在循环内你都是 paserngers[i] 5 次。您正在运行 10*5 = 50 个数组分配。

    每个乘客[i](但第一个)都会覆盖前一个。

    例如,在第一次迭代中,i = 0。所以你运行:

                passengers[0] = new Passenger("nomee", "12", "2011-10-02");
                passengers[0] = new Passenger("nomee2", "1", "1957-10-02");
                passengers[0] = new Passenger("nomee2", "0", "19-101-02");
                passengers[0] = man1.createPassenger("name", "3", "1997-10-02");
                passengers[0] = man1.createPassenger("name", "3", "1997-10-02");
    

    在第二次迭代中:

                passengers[1] = new Passenger("nomee", "12", "2011-10-02");
                passengers[1] = new Passenger("nomee2", "1", "1957-10-02");
                passengers[1] = new Passenger("nomee2", "0", "19-101-02");
                passengers[1] = man1.createPassenger("name", "3", "1997-10-02");
                passengers[1] = man1.createPassenger("name", "3", "1997-10-02");
    

    就这样,10 次。在其中一次迭代中,您使用错误的日期调用构造函数(除了其他 4 次使用正确的日期)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-06
      • 2018-09-17
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多