2016-01-08 45 views
-1

我在运行计时器的过程中发现了一个错误。计时器应该这样做:Java Swing Timer没有完成它的任务

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 
... 

但事实并非如此,而是它停止做什么,它的意思是半路做。

+2

永远不要让你的catch块变空。你为什么要忽略任何可能抛出的异常?至少打印堆栈跟踪,catch(Exception ex){ex.printStackTrace(); }' –

+0

对于我们所知的所有情况,这可能只不过是一个NullPointerException类型的问题。 –

回答

5
ImplementedJPanel[] panelArray = (ImplementedJPanel[])panelBox.getComponents(); 

这绝对不行。它会抛出一个异常,看起来像这样:

线程“main”中的异常java.lang.ClassCastException:[Ljava.awt.Component;不能转换为[LImplementedJPanel;

即使数组仅包含第二种类型的对象,也不能将一个类型的数组转换为另一个类型的数组。数组本身仍然是不同的类型。

而且你会看到这个异常,如果你没有这样做:

catch(Exception ex){} 

这告诉你的程序上任何不顺心默默地消失,没有告诉你发生了什么。你应该只捕获你期望抛出的Exception,并且如果至少在做些事情来显示/记录它们,所以你知道发生了什么并且可以修复它(尽管你也应该尝试并处理异常以查看如果你能恢复)。

+0

好的!一加。 –