【发布时间】: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