-1

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.

Barry
  • 216
  • 1
  • 3
  • 13

1 Answers1

1

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.

Pieter12345
  • 1,713
  • 1
  • 11
  • 18
  • I updated my post with some pseudo code. I did not write the full code I am working on so I didn't even know it was related to threading since I don't see any thread creation or related code anywhere. It would make sense that the issue would be threads though (maybe it is attempting to add or remove objects from the collection out of order). Is there a way to force the code to not use threading, or to only use one thread? – Barry Oct 07 '21 at 20:58
  • 1
    [tag:jfreechart] is pure Java2D; in contrast, [tag:swing] is _not_ thread-safe; you can check for violations like [this](https://stackoverflow.com/a/7788806/230513). – trashgod Oct 07 '21 at 22:15