【问题标题】:Return statement within an if statement and printing it out to a fileif 语句中的 return 语句并将其打印到文件中
【发布时间】:2014-06-30 12:44:58
【问题描述】:

我正在开发一个打卡/打卡程序。我这样做是为了练习我的编码。我刚刚完成了我的 Java 1 课程,所以我对 Java 的广度知之甚少。因此,我的代码将使用许多技术和方法,这些技术和方法可以被更先进的技术替代并更有效地完成,但现在这不是我想要的。

我有一堂课,我有最混乱的方法。在这个类中,我创建员工,我允许他们签入,我允许他们签出。每次签入和签出都打印到文件中。作为我程序的一部分,我有一种方法可以找到时间和超时之间的差异,并给出经过的时间并将其打印到文件中。

程序完美地在控制台中显示经过的时间,但是当它写入文件时,它会打印空。在我计算经过时间的方法中,我不明白为什么 if 语句中的 return 语句被忽略,它直接变为 null 而不是返回正确的经过时间。我有null 的原因是因为我的编译器告诉我添加它,因为它缺少返回语句。

public static String timeOut() {
  Date startDate;
  Date endDate;

  for (int i = 0; i < date.size(); i = i + 1) {
    for (int j = 0; j < date2.size(); j = j + 1) {
      if (date.get(i).getAcctNumber().equals(date2.get(j).getAcctNumber())) {
        startDate = date.get(i).getDate();
        endDate = date2.get(j).getDate();
        long duration = endDate.getTime() - startDate.getTime();

        // This is a continues program that doesn't close, so i remove the
        // values from array after i use them to avoid confusion when finding
        // the time elapsed. Otherwise the array will be to big and have
        // duplicates
        date.remove(i);
        date2.remove(j);

        long diffSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
        if (diffSeconds < 60) {
          return "You have been out for " + diffSeconds + " Seconds ";
        }
        if (diffSeconds > 60 && diffSeconds < 3600) {
          long diffMinutes = (diffSeconds / 60);

          long difference = TimeUnit.MINUTES.toSeconds(diffMinutes);
          diffSeconds = (diffSeconds - difference);

          return "You have been out for " + diffMinutes + " Minutes "
              + " and " + diffSeconds + " Seconds ";
        }
        else if (diffSeconds >= 3600) {
          long diffMinutes = (diffSeconds / 60);
          long diffHours = (diffMinutes / 60);
          long difference = TimeUnit.MINUTES.toSeconds(diffMinutes);
          diffSeconds = (diffSeconds - difference);

          long diff = TimeUnit.HOURS.toMinutes(diffHours);
          diffMinutes = (diffMinutes - diff);

          return "You have been out for " + diffHours + "Hours: "
              + diffMinutes + " :Minutes " + diffSeconds + " :Seconds";
        }
      }
      else {
        continue;
      }
    }
  }
  return null;
}

以上是我的“查找已用时间”方法,我想知道为什么它将null 打印到文件中。请注意,我在代码的另一部分中调用了此方法。我将其写入文件如下:

File log = new File("log.txt");
FileWriter s = new FileWriter("log.txt", true);
PrintWriter q = new PrintWriter(s);

for (int j = 0; j < emp.size(); j++) {
  if (emp.get(j).getAcctNumber().equals(en)) {
    q.println(emp.get(j) + " " + "Checked OUT on:" + " " + d + " " + timeOut());
  }
}
q.close();

这只是我签入方法的一小部分,用户可以在其中重新签入系统。它显示了我如何将其写入文件。 以下是在文件中找到的输出:

Parker , Peter 55 退房时间:2014 年 5 月 12 日星期一 20:42:07 EDT

Parker , Peter 55 入住日期:2014 年 5 月 12 日星期一 20:42:11 EDT null

我真的不知道发生了什么,我觉得它有一个简单的解决方案,但我已经搜索和排除故障无济于事。

public class DatesCLI {

  public String empnum;
  public Date d = new Date();

  public DatesCLI(String en, Date date) {
    d = date;
    empnum = en;
  }

  @Override
  public String toString() {
    return String.format(empnum) + " " + d;
  }

  public Date getDate() {
    return d;
  }

  public String getAcctNumber() {
    return empnum;
  }

}

这些是我创建的数组:

private static ArrayList<DatesGUI> date = new ArrayList<>();
private static ArrayList<DatesGUI> date2 = new ArrayList<>(); 

【问题讨论】:

  • 在 q.close() 之前尝试 q.flush()。
  • 没用,还是打印出null。
  • 不能用调试器一步一步来吗?检查diffSeconds 的值以及为什么它没有进入if
  • 什么是日期和日期2?如果它们是集合,则在迭代它们时不能调用 remove。您需要获取一个迭代器并对其进行迭代。
  • 对不起,如果没有良好的缩进,阅读代码太难了:(

标签: java if-statement return


【解决方案1】:

我的建议是使用调试器运行代码。我觉得您的代码没有通过 TimeOut 函数中的 if 语句运行。如果发生这种情况,您很可能输出 null。

我确实意识到您在大约 30 天前发布了这个问题,如果您还没有弄清楚,请告诉我,我会尝试为您进一步调查。

【讨论】: