Java not catching exception being thrown from "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException:

285 Views Asked by At

I have a block of code that I surrounded with a try catch block with the most general exception, yet it never gets caught since the logic in my catch statement never executes and the program continues.

try{
    add an XYSeries object to a jfree XYSeriesCollection. 
    // do unrelated stuff
    remove said series from the XYSeriesCollection.
}
catch(Exception e){
    e.printStackTrace();
    System.exit(-1);
}

The code plots some info on a chart with the jfree library. Here is the exception that is printed out to the console but is never caught.

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:659) at java.util.ArrayList.get(ArrayList.java:435) at org.jfree.data.xy.XYSeriesCollection.getX(XYSeriesCollection.java:357) at org.jfree.data.xy.AbstractXYDataset.getXValue(AbstractXYDataset.java:75) at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawSecondaryPass(XYLineAndShapeRenderer.java:1142) at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawItem(XYLineAndShapeRenderer.java:927) at org.jfree.chart.plot.XYPlot.render(XYPlot.java:3828) at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3389) at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1237) at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1677) at javax.swing.JComponent.paint(JComponent.java:1056) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210) at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579) at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502) at javax.swing.RepaintManager.paint(RepaintManager.java:1272) at javax.swing.JComponent._paintImmediately(JComponent.java:5158) at javax.swing.JComponent.paintImmediately(JComponent.java:4969) at javax.swing.RepaintManager$4.run(RepaintManager.java:831) at javax.swing.RepaintManager$4.run(RepaintManager.java:814) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

How can I catch this exception correctly? I've already tried copying and pasting in the specific exception 'java.lang.IndexOutOfBoundsException' into the catch block as well.

1

There are 1 best solutions below

2
On

The problematicFunction method might be changing some data and indirectly cause the exception, but the exception gets thrown on the AWT-EventQueue-0 thread, which is very likely a different thread. This either looks like a bug in the jfree library, or you might be violating API by not calling problematicFunction on the Swing/AWT event thread. Which one is the case is very dependent on your code, which you should include in your question.