我在程序中发现错误,同时运行计时器。计时器应该这样做:
Timer t = new Timer(60000, new ActionListener(){
public void actionPerformed(ActionEvent ev){
System.out.println(sdf.format(currentDate.getTime()));
try{
String update = sdf.format(currentDate.getTime());
Date dateToUpdate = sdf.parse(update);
int newMinutes = currentDate.getTime().getMinutes() + 1;
dateToUpdate.setMinutes(newMinutes);
currentDate.setTime(dateToUpdate);
System.out.println(sdf.format(currentDate.getTime()));
Component[] panelComps = mainPanel.getComponents();
System.out.println("created comp array");
Box panelBox = (Box) panelComps[0];
ImplementedJPanel[] panelArray = (ImplementedJPanel[])panelBox.getComponents();
System.out.println("created panel array");
for(ImplementedJPanel target : panelArray){
System.out.println("entered loop");
if(sdf.format(currentDate.getTime()).equals(sdf.format(target.targetDate))){
System.out.println("dates match");
buildWarning(target);
}else
System.out.println("the dates are different!");
}
}catch(Exception ex){}
}
});
让我解释一下:计时器应该获取当前日期,每分钟更新一次,与来自ImplementedJPanel(我编写的jpanel子类)对象的目标日期进行比较。我还在控制台上放了一些打印件来观察定时器的执行情况。控制台应显示旧的当前日期,新的当前日期以及它可以成功创建阵列。但它在一定的印刷品中停止。控制台显示:
08/01/2016/07:48
08/01/2016/07:49
created comp array
但它应该显示:
08/01/2016/07:48
08/01/2016/07:49
created comp array
created panel array
entered loop
...
但它不会,而是停止做半途而已的事情。
答案 0 :(得分:5)
ImplementedJPanel[] panelArray = (ImplementedJPanel[])panelBox.getComponents();
这永远不会奏效。它会抛出一个看起来像这样的例外:
线程“main”中的异常java.lang.ClassCastException:[Ljava.awt.Component;无法转换为[LImplementedJPanel;
即使数组只包含第二种类型的对象,也无法将一种类型的数组转换为另一种类型。阵列本身仍然是不同的类型。
如果你没有这样做,你会看到这个例外:
catch(Exception ex){}
告诉你的程序在没有告诉你发生了什么的情况下默默地对任何出错的事情进行失败。你应该只捕获你期望抛出的Exception
,并且至少做一些事情来显示/记录它们,这样你就知道发生了什么并且可以解决它(尽管你还应该尝试处理异常以查看是否可以恢复。