Java中的Return方法不符合顺序



我正在做一个项目,在这个项目中,我返回一系列Java方法的值,以便可以输出结果。但它正在被打印出来,不同步。它应该如下所示:

return
"Name:          " + getFirstName() + " " + getLastName() + "n" + 
"Id:            " + getEmployeeId() + "n" +   
"Hourly Rate:   $" + getHourlyRate() + "n" +
timeCard.toString()  +
"Weekly Pay:    $" + getWeeklyPay();

但是,当timeCard.toString()在输出中应该是数字4时,它的调用会一直上升到顶部。下面是timeCard.toString()方法:public String到String(){

System.out.println("Weekly Hours:   " + getWeeklyHours());
for(int i = 0; i < NUMDAYS; i++ )
{
System.out.println("        Day "  + (i + 1) + ": " + getHoursByDay(i));
}
return "";//I had to place this hack here so the toString() format is valid. 
}

就使用return关键字的输出而言,是否有一个遵守的操作顺序?还是我的代码导致它出现故障?请提供您的指导,说明为什么此代码出现故障?我该怎么修?

这是我得到的输出:

员工Id:

1001员工时薪:

56

输入第1天的小时数:

8

输入第2天的小时数:

8

输入第3天的小时数:

8

输入第4天的小时数:

8

输入第5天的小时数:

8

员工:


每周工作时间:40

    Day 1: 8
    Day 2: 8
    Day 3: 8
    Day 4: 8
    Day 5: 8

姓名:Stanford Marceles

Id:1001

每小时收费:$56.0

周薪:2240美元

构建成功(总时间:29秒)

干杯,

您可以使用StringBuilder创建字符串,如下所示:

public String toString() {
  StringBuilder builder = new StringBuilder();
  builder.append("Weekly Hours:   " + getWeeklyHours()));
  for(int i = 0; i < NUMDAYS; i++ ) {
    builder.append("        Day "  + (i + 1) + ": " + getHoursByDay(i)));
  }
  return builder.toString();
}

我没有仔细检查,但这大致是您想要的。(有几种方法。)

public String toString() {
    StringBuffer buff = new StringBuffer();
    buff.append("Weekly Hours:   " + getWeeklyHours());
    for(int i = 0; i < NUMDAYS; i++ )
    {
        buff.append("        Day "  + (i + 1) + ": " + getHoursByDay(i));
    }
    return buff.toString();
}

toString()不是应该向控制台输出字符串,而是向调用函数返回字符串。这也是为什么您需要return "";(该方法具有String返回类型)。

该方法看起来应该更像:

public String toString() {
    // Create string builder 'message' to hold the String generated
    // StringBuilder is used because it has much less overhead for appending
    StringBuilder message new StringBuilder();
    message.append("Weekly Hours:   ")
    message.append(getWeeklyHours());
    for(int i = 0; i < NUMDAYS; i++ )
    {
        // Append the Day and the hours for the specific day to the message
        message.append("n        Day ");
        message.append(i + 1);
        message.append(": ");
        message.append(getHoursByDay(i));
    }
    return message.toString(); // Returns the builder as a string
}

您的toString()方法正在调用System.out.println(),其中is应该只是返回时间卡的字符串表示。因此,当您构建输出字符串时,您的代码会生成控制台输出。然后打印字符串。这就是为什么。

顺便说一句,托尼在评论中说了这句话。

编辑:

作为对您评论的回应,是的,您肯定可以在toString()中使用循环。问题是,在进入循环之前,您将返回每周小时数字符串,当您返回一些内容时,您将退出该方法。所以你只需要按照以下几行来改变它:

public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("Weekly hours: " + getWeeklyHours()); // notice that I'm not returning anything
    for (int i < 0; i < NUMDAYS; i++) {
        builder.append(" Day " + (i + 1) + ": " + getHoursByDay(i));
    }
    return builder.toString(); // return once, at the end
}

如果您想对性能更加小心,可以将字符串连接分解为生成器的不同附加。我只是想让代码易于阅读。:-)

toString()方法应该返回所需的字符串,而不是将其打印到System.out。与其打印它,不如尝试使用StringBuilder并返回它的字符串表示。类似这样的东西:

public String toString() {
  StringBuilder buf = new StringBuilder();
  buf.append("Weekly Hours:   ").append(getWeeklyHours());
  for(int i=0; i<NUMDAYS; i++) {
    buf.append("        Day ").append(i + 1)
       .append(": ").append(getHoursByDay(i));
  }
  return buf.toString();
}

最新更新