public synchronized void refresh() {
while (this.keys() != null && this.keys().hasMoreElements()) {
String ticketID = this.keys().nextElement().toString();
Ticket t = this.getTicket(ticketID);
if (t.isExpired()) {
this.deleteTicket(ticketID);
System.out.println("Ticket " + ticketID + "(" + t.username +
") has been deleted (Expired).");
}
}
}
开始这段程序在运行的时候,陷入死循环,最后报OutofMemoryError,最后发现while循环的时候 使用this.keys().hasMoreElements()每次循环都是一个新的Enumeration对象,游标始终是在第一个Element处,因此永远hasMoreElements为true,即陷入死循环。代码修改为如下即解决了问题。
public synchronized void refresh() {
Enumeration e = this.keys();
while (e != null && e.hasMoreElements()) {
String ticketID = e.nextElement().toString();
Ticket t = this.getTicket(ticketID);
if (t.isExpired()) {
this.deleteTicket(ticketID);
}
t = null;
ticketID = null;
}
}
while (this.keys() != null && this.keys().hasMoreElements()) {
String ticketID = this.keys().nextElement().toString();
Ticket t = this.getTicket(ticketID);
if (t.isExpired()) {
this.deleteTicket(ticketID);
System.out.println("Ticket " + ticketID + "(" + t.username +
") has been deleted (Expired).");
}
}
}
开始这段程序在运行的时候,陷入死循环,最后报OutofMemoryError,最后发现while循环的时候 使用this.keys().hasMoreElements()每次循环都是一个新的Enumeration对象,游标始终是在第一个Element处,因此永远hasMoreElements为true,即陷入死循环。代码修改为如下即解决了问题。
public synchronized void refresh() {
Enumeration e = this.keys();
while (e != null && e.hasMoreElements()) {
String ticketID = e.nextElement().toString();
Ticket t = this.getTicket(ticketID);
if (t.isExpired()) {
this.deleteTicket(ticketID);
}
t = null;
ticketID = null;
}
}