Well, that is just amazingly stupid.  Who would have thought that removeAll() would first set the selected index to -1 (but not remove the tabs yet) and *then* call the listeners, and only *then* remove the remaining tabs?

I have committed an additional check in TabbedInspector.updateDisplayedInspector().  Lemme know if you find any other errors.

Sean

On Feb 5, 2015, at 11:12 AM, Christian Meyer <[log in to unmask]> wrote:

> Hello!
> 
> If TabbedInspector.clear() is called JtabbedPane.removeAll() will set the selected index to -1. The change event fired thereafter will lead to an ArrayIndexOutOfBoundsException in TabbedInspector.updateDisplayedInspector() because there is no check for invalid indices and the tab count is still > 0.
> 
> Tested with mason revision 1010 and OpenJDK version "1.7.0_75".
> 
> Best regards,
> Christian
> 
> import sim.portrayal.Inspector;
> import sim.portrayal.inspector.TabbedInspector;
> 
> public class TestTabbedInspector {
>    public static void main(String[] args) {
> 	TabbedInspector tabbedInspector = new TabbedInspector();
> 
> 	Inspector blankInspector = new Inspector() {
> 	    private static final long serialVersionUID = 1L;
> 
> 	    @Override
> 	    public void updateInspector() {
> 	    }
> 	};
> 
> 	tabbedInspector.addInspector(blankInspector);
> 	tabbedInspector.clear();
>    }
> }