The SDK is telling me that class Level has an error (via an error icon on the class tab), but I can find no other error icon on the side where it is usually located.
When I try to run, I get an ExceptionInInitializerError where I create a new instance of Level. This error also came up when I copy/pasting abstract methods into subclasses, and went away after I comment then uncommented the relevant code.
class Level
package levels;
import Tiles.BasicWall;
import Tiles.Crate;
import Tiles.Goal;
import Tiles.Pit;
import Tiles.Tile;
import Tiles.Turret;
import Tiles.Walkway;
import com.jme3.asset.AssetManager;
import com.jme3.input.InputManager;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import main.Coordinate;
import main.Rules;
import player.Player;
/**
*
* @author codex
*/
public class Level {
AssetManager asset;
InputManager input;
String title, grid;
private ArrayList<ArrayList<Character>> data = new ArrayList<>();
Coordinate start;
boolean complete = false;
public static final char START = 'P', NONE = ' ';
public static final char TURRET_UP = '^', TURRET_DOWN = 'v',
TURRET_LEFT = '<', TURRET_RIGHT = '>';
public static final char ATTACHEMENT_MARKER = 'A';
private final ArrayList<Tile> attachements = new ArrayList<>();
Player plr;
static final Map<Character, Function<Coordinate, Tile>> tileBindings;
static {
tileBindings = new HashMap<>();
// add bindings here
tileBindings.put('#', BasicWall ::new);
tileBindings.put('-', Walkway ::new);
tileBindings.put('=', Crate ::new);
tileBindings.put('@', Goal ::new);
tileBindings.put('U', Pit ::new);
}
public Level(AssetManager asset, InputManager input, String title, String grid) {
this.asset = asset;
this.input = input;
this.title = title;
this.grid = grid;
data = LevelReader.gridToList(this.grid, '+');
resetPlayer(asset);
}
public void resetPlayer(AssetManager manager) {
plr = new Player();
plr.build(manager);
plr.initKeys(input);
}
public void setPlayerLocation(Vector3f loc) {
plr.setLocation(loc);
}
public ArrayList<Tile> read() {
ArrayList<Tile> tiles = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
for (int j = 0; j < data.get(i).size(); j++) {
char c = data.get(i).get(j);
Coordinate coord = new Coordinate(j, i);
switch (c) {
case NONE: break;
case ATTACHEMENT_MARKER: break;
case START:
plr.setLocation(new Vector3f(coord.getX()*Rules.UNIT, 0, coord.getY()*Rules.UNIT));
plr.setCoordinates(coord);
tiles.add(new Walkway(coord));
break;
case TURRET_UP:
tiles.add(new Turret(coord, new Vector2f(0, -1)));
tiles.add(new Walkway(coord));
break;
case TURRET_DOWN:
tiles.add(new Turret(coord, new Vector2f(0, 1)));
tiles.add(new Walkway(coord));
break;
case TURRET_LEFT:
tiles.add(new Turret(coord, new Vector2f(-1, 0)));
tiles.add(new Walkway(coord));
break;
case TURRET_RIGHT:
tiles.add(new Turret(coord, new Vector2f(1, 0)));
tiles.add(new Walkway(coord));
break;
default: tiles.add(readCharacter(c, coord));
}
}
}
for (Tile i : attachements) tiles.add(i);
return tiles;
}
private Tile readCharacter(char c, Coordinate coord) {
Function<Coordinate, Tile> s = tileBindings.get(c);
if (s == null) throw new IllegalArgumentException("oops! u failed with "+c);
return s.apply(coord);
}
public void attach(Tile t) {
attachements.add(t);
}
public void setComplete(boolean c) {
complete = c;
}
public String getTitle() {
return title;
}
public Coordinate getStart() {
return start;
}
public boolean isComplete() {
return complete;
}
public Player getPlayer() {
return plr;
}
public ArrayList<ArrayList<Character>> getGridData() {
return data;
}
}
Exception details
The error occurs in class World1 (subclass of World), where a new instance of Level was created.
java.lang.ExceptionInInitializerError
at levels.worlds.World1.initLevels(World1.java:31)
at levels.worlds.World.<init>(World.java:48)
at levels.worlds.World1.<init>(World1.java:26)
at levels.GameData.<init>(GameData.java:25)
at main.Main.loadData(Main.java:165)
at main.Main.simpleInitApp(Main.java:58)
at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:220)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:130)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:211)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: java.util.Map.put
at levels.Level.<clinit>(Level.java:57)
... 10 more
Unfortunately, I added a lot of code since the last successful run, so it is more difficult to trace exactly.
Any help is appreciated