2016-07-01 18 views
0

Ich bekomme eine NullPointerException jedes Mal, wenn ich versuche, den Inhalt meines BufferedReader zu erhalten, wenn ich das Projekt, das bereits in Jar gepackt ist, ausführen. Wenn es innerhalb von IDE (IntelliJ) läuft, gibt es kein Problem. Ich habe bereits alle vorherigen InputStreams überprüft, sie scheinen in Ordnung zu sein. Hast du vielleicht einen Tipp? Vielen Dank im Voraus!NullPointerException beim Lesen des Inhalts von BufferedReader, obwohl es nicht leer ist

String pathToFontDir = "/fonts/Open_Sans"; 
GraphicsEnvironment localGE = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
final InputStream is = Session.class.getResourceAsStream(pathToFontDir); 
if(is != null){ 

     final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); 
     final BufferedReader br = new BufferedReader(isr); 

     List fonts = br.lines().collect(Collectors.toList()); //throws NullPointerException 
     if(fonts.size() > 0){ 
      for(Object font: fonts){ 
       InputStream fis = loader.getResourceAsStream(pathToFontDir + "/" + font); 
       localGE.registerFont(Font.createFont(Font.TRUETYPE_FONT, fis)); 
      } 
     } else{ 
      throw new IOException("Der angegebene Ordner enthält keine Schriftdateien!"); 
     } 
    } 

Ich habe auch versucht, zu überprüfen gerade, wheather meine BufferedReader alles enthält, aber es throwed wieder eine Ausnahme ohne jede Zeile Rückkehr:

 String fontName; 
     while((fontName = br.readLine()) != null) //throws NPE as well 
      System.out.println(fontName); 

Der Stack-Trace:

java. lang.NullPointerException bei java.io.FilterInputStream.read (Unbekannte Quelle) bei sun.nio.cs.StreamDecoder.readBytes (Unbekannte Quelle) bei sun.nio .cs.StreamDecoder.implRead (Unbekannte Quelle) bei sun.nio.cs.StreamDecoder.read (Unbekannte Quelle) bei java.io.InputStreamReader.read (Unbekannte Quelle) bei java.io.BufferedReader.fill (Unbekannte Quelle) bei java.io.BufferedReader.readLine (Unknown Source) bei java.io.BufferedReader.readLine (Unknown Source) bei java.io.BufferedReader $ 1.hasNext (Unknown Source) bei java.util.Iterator.forEachRemaining (Unknown Source) bei java.util.Spliterators $ IteratorSpliterator.forEachRemaining (Unknown Source) bei java.util.stream.AbstractPipeline.copyInto (Unknown Source) bei java.util.stream.AbstractPipeline.wrapAndCopyInto (Unknown Source) bei java.util.stream.ReduceOps $ ReduceOp.evaluateSequential (Unbekannte Quelle) bei java.util.stream.AbstractPipeline.evaluate (Unbekannte Quelle) bei java.util.stream.ReferencePipeline.collect (Unbekannte Quelle) bei main.java.backend.Session.importFontResource (Session.java:137) bei main.java.backend.Session.main (Session.java:180)

+3

Sind Sie sicher, dass die erforderlichen Dateien in die JAR-Datei kopiert werden? –

+0

Ja, tatsächlich habe ich es noch einmal überprüft. –

+0

Also, im Wesentlichen versuchen Sie die 'Open_Sans' ** Datei ** zu lesen, oder? Und das ist was scheitert? –

Antwort

2

Sie können ein Ressourcenverzeichnis nicht als solches lesen. Da es keine einfache Bereitstellung in Standard-Java gibt, erstellen Sie eine "Verzeichnis" -Liste in einer Ressourcendatei, und lesen Sie das. Halten Sie es konventionell.

Für die „unruhig“ Lösung: http://www.uofr.net/~greg/java/get-resource-listing.html

+0

Danke, ich werde es versuchen! :) –

2

Sie öffnen eine Input für Ressource /fonts/Open_Sans.

Wenn in der IDE ausgeführt wird, ist diese Ressource ein Verzeichnis. Scheint - ich wusste das nicht - dass es eine Liste aller Dateien in diesem Verzeichnis zurückgibt.

Wenn Sie den in einem Jar gepackten Code ausführen, verweist die Ressource auf einen Verzeichniseintrag in der Jar-Datei. Die Input für diese Ressource ist nicht null, aber wenn man von ihm zu lesen beginnt, wird ein NPE geworfen:

Exception in thread "main" java.lang.NullPointerException 
    at java.io.FilterInputStream.read(FilterInputStream.java:133) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
    at java.io.InputStreamReader.read(InputStreamReader.java:184) 
    at java.io.BufferedReader.fill(BufferedReader.java:161) 
    at java.io.BufferedReader.readLine(BufferedReader.java:324) 
    at java.io.BufferedReader.readLine(BufferedReader.java:389) 

(Die Input, die Sie von getResourceAsStream erhalten, ist ein sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream die FilterInputStream erstreckt und es saniert nicht sein Konstruktorparameter, der die NPE später verursacht).

+0

+1 - 'Scheint - ich wusste nicht, dass - es eine Liste aller Dateien in diesem Verzeichnis zurückgibt.' Ich auch nicht ... war ziemlich überrascht, als ich es versuchte ... –

+0

Yeah you bin völlig richtig, ich habe gerade in den Stack-Trace meiner Exception geschaut und das relatiert. –

0

Sie könnten den Strom auf eine andere Weise zu prüfen, zu öffnen.Wenn ich eine JAR oder Classpath wollen von sich selbst zu lesen, verwende ich diese Kette:

File classpathBase = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); 

Sobald Sie, dass, es ist entweder eine JAR-Datei oder ein Verzeichnis. Von dort können Sie die Ressource mit einer Methode in diesem Sinne lesen:

String resourceName = "/fonts/Open_Sans"; 
InputStream in; 
JarFile jarFile = null; 
if (classpathBase.isDirectory()){ 
    in = new FileInputStream(classPathBase.getPath() + resourceName); 
} else { 
    jarFile = new JarFile(file); 
    JarEntry entry = jarFile.getEntry(resourceName); 
    in = jarFile.getInputStream(entry); 
} 
// read from in.read() 
in.close(); 
if (jarFile != null){ 
    jarFile.close(); 
}