getResource liefert permanent NullPointerException

fReAkgoesTutorials

Grünschnabel
PHP:
public static void loadConfig() throws IOException, URISyntaxException{
		URL url = ConfigLoader.class.getClass().getResource("/META-INF/config.ini");
		System.out.println(url);
		File f = new File(url.toURI());

Das Dumme Teil liefert mir permanent

Code:
Exception in thread "main" java.lang.NullPointerException
	at meinpackage.ConfigLoader.loadConfig(ConfigLoader.java:26)
	at meinpackage.Main.main(Main.java:15)
:(
Also sagt mir, dass url.toURI() kein Ergebnis liefert...
Die config.ini liegt im meta-inf ordner under das ganze ist keine runnable jar, sondern liegt so noch in eclipse...

Kann mir jemand helfen? Ich komm einfach nich weiter und brauche unbedingt nen Zugriff auf die config.ini, die irgendwo auf dem Rechner liegen soll. :/

ps: Ja die Suchfunktion ist klasse, nur kommt da keiner zu nem Ergebnis, bzw die Probleme werden meist nicht gelöst oder sind unterschiedlich zu Meinem

Gruß,

Chris
 
So... bin die ganze Zeit am rumbasteln..

PHP:
public static void loadConfig() throws IOException, URISyntaxException{
		URL url = ConfigLoader.class.getResource("config.ini");
		System.out.println(url);
		File f = new File(url.toURI());

Das funktioniert also, sobald die config.ini im package des ConfigLoaders ist... aber das kann ja nicht die Lösung des problems sein. Ich komme nun zwar dort drauf, aber wie kann ich ne absolute Pfadangabe machen? Ich komme da gerade nicht ganz weiter :/...
 
PHP:
URL url = ConfigLoader.class.getResource("/config.ini");

sorgt dafür, dass die config.ini nicht mehr im package liegen muss ,sondern im src... aber wie ichs schaff, nen absoluten path aufzurufen oder gar die config dynamisch dort aufzurufen, wo nachher die runnable jar liegt(gleicher Ordner), ist mir weiterhin schleierhaft.
 
Du musst mit dem "/" am Anfang des Pfades aufpassen.

Als Beispiel der mehreren relativen Pfaden:
Java:
            URL resource = MyClass.class.getResource("/");
            System.out.println(resource);
            resource = MyClass.class.getResource("./");
            System.out.println(resource);
            File file = new File("./");
            System.out.println(file.getAbsolutePath());
            System.out.println(System.getProperty("user.dir"));

Das erste liefert den relativen Pfad vom Jar aus, zum Beispiel file:
/D:/dev/workspaces/project/bin/classes
Das zweite liefert den relativen Pfad von der Klasse aus, bzw. vom Package file:
/D:/dev/workspaces/project/bin/classes/dein/package/zur/klasse/

Und weil er nichts an deiner Stelle findet, ist die Variable url die du bekommst null. Daher bekommst du bei url.toURI() eine NullPointer weil man schlecht auf nichts eine Methode ausführen kann :)


Mit String curDir = System.getProperty("user.dir"); kannst du dir das aktuelle Arbeitsverzeichnis geben lassen oder du kannst einfach relativ zum Arbeitsverzeichnis arbeiten mit new File("config.ini") .
 
Zuletzt bearbeitet:
Danke....

Dass, was ich die ganze Zeit wohl gesucht habe, war System.getProperty("user.dir")...

Du hast mir wieder Hoffnung geschenkt :D,

Vielen vielen Dank.

Code also jetzt:

Java:
File f = new File(System.getProperty("user.dir")+"\\config.ini");

ganz stupide ohne url oder sonstiges... und schon findet die jar die config, die einfach nur im selben Verzeichnis liegen muss
 
Tipp : du kannst auch unter Windows die normalen Slashes verwenden. Sieht im übrigen auch besser aus.
 
Naja das mache ich lieber nicht, da mir der java-erzeugte path auch mit Backslashes vorliegt. Ich weiß nicht, obs konform ist, wenn ich den dann mit Slashes fortführe..
 
Ähm .. momment ... du bekommst von Java einen String der eine Pfad mit Backslashes enthält ? ... Na da musst du mich jetzt aber wirklich aufklären *aufm Schlauch steh*.

Und btw : ja , es wäre schon konform wenn du den Pfad mit normalen Slashes fortführst da alle SE-Klassen eigentlich auch nur Pfade mit Slashes liefern sollten.
 
Ich will dir jetzt keinen Mumpitz erzählen, ich schau das Morgen nochmal nach, bin dann wieder auf Arbeit. Aber ich bin mir eigentlich sehr sicher, einen Pfad mit Backslashes erhalten zu haben in der Ausgabe ;), da ich sonst auch mit normalem Slash fortgeführt hätte. Ich habe also nur den Pfad erweitert, von daher
 
Wie gesagt : alle SE-Klassen
Der Aufruf von System.getProperty(String) gibt unter Windows natürlich Pfade mit Backslashes *schuldige ... mein Fehler .. hab ich glatt überlesen*. Du solltest aber der Kompatibilität wegen IMMER mit normalen Slashes arbeiten da dieser unter Windows sogar vom Befehlszeileninterpreter *CMD* akzeptiert werden. Wenn man unter Unix versucht einen Pfad mit Backslashes aufzurufen *was für Windows ganz normal ist* scheitert man kläglich mit Fehlern. Was Windows-Freigaben allerdings angeht so MÜSSEN diese mit Backslashes geschrieben werden da dies so im Protokoll vorgegeben ist. Unter Windows zum Beispiel erreicht man andere Rechner mit \\Name ... ein //Name funktioniert hingegen nicht.
 
Zurück