Once upon a time (approx. 25 minutes ago), I was writing an EveryFrameWeaponEffectPlugin, when lo! A vicious bug did crash my game upon startup. Frantically I searched about for the beast and found these clues three:
1. A popup dialogue box with a familiar message: 'Fatal: Index: 0, Size: 0'
2. A starsector.log with an epitaph at the end reading thusly;
22188 [Thread-5] WARN com.fs.starfarer.title.ooOO.D - Error loading mission preview
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.fs.starfarer.loading.scripts.ScriptStore.o00000(Unknown Source)
at com.fs.starfarer.settings.StarfarerSettings.Ó00000(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetMember.updateStatsBasedOnCrew(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetMember.updateOnlyStatsThatCanRelyOnCROrCrew(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetMember.updateStats(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetMember.<init>(Unknown Source)
at com.fs.starfarer.combat.super.o00000(Unknown Source)
at com.fs.starfarer.title.ooOO.K.addToFleet(Unknown Source)
at com.fs.starfarer.title.ooOO.K.addToFleet(Unknown Source)
at data.missions.turningthetables.MissionDefinition.defineMission(MissionDefinition.java:37)
at com.fs.starfarer.title.ooOO.K.<init>(Unknown Source)
at com.fs.starfarer.title.ooOO.D.o00000(Unknown Source)
at com.fs.starfarer.title.ooOO.J.o00000(Unknown Source)
at com.fs.starfarer.title.ooOO.J.<init>(Unknown Source)
at com.fs.starfarer.title.ooOO.E.<init>(Unknown Source)
at com.fs.starfarer.title.OoOO.ÖôÒ000(Unknown Source)
at com.fs.starfarer.title.OoOO.class.for$super(Unknown Source)
at com.fs.starfarer.B.ØÓÒ000(Unknown Source)
at com.fs.oOOO.A.Ò00000(Unknown Source)
at com.fs.starfarer.combat.O0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.o00000(Unknown Source)
at com.fs.starfarer.StarfarerLauncher$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
22227 [Thread-5] DEBUG com.fs.graphics.TextureLoader - Loading [graphics/backgrounds/background4.jpg] as texture with id [graphics/backgrounds/background4.jpg]
23571 [Thread-5] ERROR com.fs.starfarer.combat.O0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO - java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.fs.starfarer.loading.scripts.ScriptStore.o00000(Unknown Source)
at com.fs.starfarer.settings.StarfarerSettings.Ó00000(Unknown Source)
at com.fs.starfarer.combat.entities.Ship.<init>(Unknown Source)
at com.fs.starfarer.loading.specs.oo0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.o00000(Unknown Source)
at com.fs.starfarer.loading.specs.oo0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.o00000(Unknown Source)
at com.fs.starfarer.loading.specs.oo0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.o00000(Unknown Source)
at com.fs.starfarer.title.A.Ó00000(Unknown Source)
at com.fs.starfarer.title.A.class(Unknown Source)
at com.fs.starfarer.title.A.o00000(Unknown Source)
at com.fs.starfarer.combat.oOOO.new.super(Unknown Source)
at com.fs.starfarer.combat.CombatEngine.advance(Unknown Source)
at com.fs.starfarer.title.OoOO.o00000(Unknown Source)
at com.fs.starfarer.B.ØÓÒ000(Unknown Source)
at com.fs.oOOO.A.Ò00000(Unknown Source)
at com.fs.starfarer.combat.O0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.o00000(Unknown Source)
at com.fs.starfarer.StarfarerLauncher$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
3. That's all. It had to be three though. 'Answer me these riddles two' doesn't exactly have a ring to it.
Notice how the exception is thrown in the mission definition for Turning the Tables. What? How?
The bug and I proceeded to do glorious battle. I was eviscerated, decapitated, and incinerated, but I kept respawning. When at last the bug succumbed to oblivion a had learned a valuable lesson about the runtime compiler that is Janino.
It is intolerant of redundancy and I, in my youthful ignorance, had been redundant. This line, and this line alone, had created the fell beast;
static final float SNAP_DISTANCE = 100;
All I had to do to kill the bug was remove the static keyword*. I still find this kinda baffling as I've used 'static final' for non primitive types without issue, and NetBeans doesn't flag it as an error, or even a warning. It certainly didn't help that all my 'clues' pointed in the wrong directions.
*Edit: OR I could have solved this by assigning a float value to the attribute instead of an integer. Like so:
static final float SNAP_DISTANCE = 100f;
Notice the 'f' suffix at the end that transforms the int into a float. This, I believe, is the preferred method.
tl;dr -
don't use 'static final' to modify a variable. It's redundant and Janino can't handle it when it's used for primitive types. Instead just use 'final'Edit: NOPE! I was wrong. While this will fix the issue I had, it's not the best way. 'static final' can be used for attributes, but you should be sure to assign the proper value type (e.i. 1 for int, 1.0f for float, and 1.0 for double)