ExceptionInInitializerError

Status
Nicht offen für weitere Antworten.

Lim_Dul

Top Contributor
Folgendes Problem habe ich, so genau kann ich mir das auch nicht erklären:

Code:
public class Handbook extends ResourceBundle {
	
	/** Erzeugt das Bundle mit einer bestimmten Lokalisierung.
	 * 
	 * @param locale Die Lokalisierung.
	 */
	public Handbook(Locale locale) {
		this.locale = locale;
		AddonList sets = Addons.getAddons();
		for (int i=0;i<sets.size();i++) {
                    // machwas, irrlevant
		}
               // Hier kracht es jetzt
		try {
		    bots = BotPool.getAllBots();
		} catch (Error e) {
			e.printStackTrace();
		}
	}
    // Hier stand mal noch mehr, unwichtig
}
Fehlermeldung:
Code:
java.lang.ExceptionInInitializerError
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:164)
	at de.limdul.cassiopeia.ai.BotList.<init>(BotList.java:17)
	at de.limdul.cassiopeia.addons.Addon.getBots(Addon.java:479)
	at de.limdul.cassiopeia.ai.BotPool.init(BotPool.java:119)
	at de.limdul.cassiopeia.ai.BotPool.getAllBots(BotPool.java:52)
	at lang.Handbook.<init>(Handbook.java:63)
	at lang.Handbook.<init>(Handbook.java:39)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
	at java.lang.Class.newInstance0(Class.java:350)
	at java.lang.Class.newInstance(Class.java:303)
	at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1055)
	at java.util.ResourceBundle.findBundle(ResourceBundle.java:925)
usw.

Die Zeile BotList.java:17 ist folgende:

Code:
	public BotList() {
		super(Bot.class.getName()); // Zeile 17
	}

Krachen tut es also beim Aufruf Bot.class

Warum? Ich tippe auf ein Classloader Problem, kann es aber nicht eingrenzen.
Hat jemand einen Vorschlag, wie ich da rangehen soll?


Noch verwirrender ist aber folgendes. Mein Programm kann sogenannte Addons laden.
Gegeben seien Addon A und Addon B.
Man kann nun Prioritäten vergeben, welches Addon bevorzugt wird.
Steht Addon A, das Hauptaddon vor Addon B, so läuft der Code durch, andersrum aber nicht.
Die Addons bestehen aber im Prinzip rein aus XML Dateien, die geladen werden.
 
R

Roar

Gast
wie sieht denn die bot klasse aus?
und: versuch mal den error zu catchen und mit getCause() die exception auszumachen die den error verursacht hat.
 

Lim_Dul

Top Contributor
Manchmal hilft es das Problem einfach aufzuschreiben.

Eine statische Variable in der Bot Klasse hat natürlich Probleme gemacht.

Hinweis an alle anderen: Statische Variablen sind böse und ResourceBundles, die beim Erzeugen aufgrund nichtexistenter properties Exceptions schmeißen ebenfalls.

Die Zeile war der Übeltäter:
Code:
private static final ResourceBundle botRes = ResourceBundle.getBundle(Resources.BOT_RES);

Ich glaub ich muss mir da was mal überlegen, das mir das Programm nicht um die Ohren fliegt, nur weil ein ResourceBundle nicht geladen werden kann.
 

WieselAc

Top Contributor
Ist echt ne interessante Frage wie man sowas intern sichert.


Ganz (mit final und allem) krieg ich es nicht hin, mein Ansatz wäre so etwas:


Code:
private static ResourceBundle botRes;

static {
    try {
        botRes = ResourceBundle.getBundle(Resources.BOT_RES)
    } catch (ExceptionInInitializerError e) {

    }
}
 

Lim_Dul

Top Contributor
Ich bin eher am überlegen, eine eigene Klasse zu machen, die den Zugriff auf das Resourcebundle kapselt und Fehler beim erzeugen des Resourcebundles abfängt.

Dann kann ich auch gleichzeitig verhindern, dass beim Zugriff auf nicht existente Keys eine Exception geschmissen wird.

Ich muss halt nur im ganzen Programm ResourceBundle durch "MyResourceBundle" ersetzen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben