Java中的返回方法不按顺序进行

时间:2012-02-23 03:28:19

标签: java

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

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

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

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秒)

干杯,

5 个答案:

答案 0 :(得分:1)

我没有仔细检查这一点,但它大概是你想要的。 (有几种方法可以做到。)

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

答案 1 :(得分:1)

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

托尼在顺便说一句的评论中说道。

编辑:

回答你的评论,是的,你绝对可以在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
}

如果您想要更加注意性能,可以将字符串连接分解为不同的附加到构建器。我只是想让代码易于阅读。 : - )

答案 2 :(得分:1)

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
}

答案 3 :(得分:1)

您可以使用StringBuilder创建String,如下所示:

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

答案 4 :(得分:0)

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