2016-07-01 3 views
0

이미 버퍼링 된 프로젝트를 실행할 때마다 BufferedReader의 내용을 가져올 때마다 NullPointerException이 발생합니다. IDE (IntelliJ) 내부에서 실행될 때 아무런 문제가 없습니다. 이전의 모든 InputStream을 이미 확인했지만, 괜찮아 보입니다. 어쩌면 좀 나아 졌니? 미리 감사드립니다. BufferedReader의 내용을 읽는 동안 NullPointerException이 발생했습니다.

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!"); 
     } 
    } 

나는 또한 내 BufferedReader로 아무것도 포함 wheather를 확인하려하지만, 어떤 행을 반환하지 않고 다시 예외가 throwed :

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

스택 추적 :

자바. lang.NullPointerException at java.io.FilterInputStream.read (알 수없는 소스) at sun.nio.cs.StreamDecoder.readBytes (알 수없는 소스) at sun.nio .cs.StreamDecoder.implRead (알 수없는 소스) at sun.nio.cs.StreamDecoder.read (알 수없는 소스) at java.io.InputStreamReader.read (알 수없는 소스) at java.io.BufferedReader.fill (알 수없는 소스)at java.io.BufferedReader.readLine (알 수없는 소스) at java.io.BufferedReader.readLine (알 수없는 소스) at java.io.BufferedReader $ 1.hasNext (알 수없는 소스) at java.util.Iterator.forEachRemaining java.util.stream.AbstractPipeline.wrapAndCopyInto (알 수없는 소스)에서 java.util.stream.AbstractPipeline.copyInto (알 수없는 소스) 에서 java.util.Spliterators $ IteratorSpliterator.forEachRemaining (알 수없는 소스) 에서 (알 수없는 소스) java.util.stream.ReduceOps의 메소드 main.java.backend.Session.importFontResource에서 java.util.stream.ReferencePipeline.collect (알 수없는 소스) 에서 java.util.stream.AbstractPipeline.evaluate (알 수없는 소스) 에서 $ ReduceOp.evaluateSequential (알 수없는 소스) (main.java.backend.Session.main에서 Session.java:137) (Session.java:180는)

+3

필요한 파일을 JAR 파일에 복사 했습니까? –

+0

예, 실제로 다시 한 번 확인했습니다. –

+0

기본적으로 당신은'Open_Sans' ** 파일 **을 읽으려고합니다, 맞습니까? 그리고 이것이 실패한 것입니까? –

답변

2

리소스 디렉토리를 읽을 수 없습니다. 표준 Java에서 쉽게 조항이 없으므로 리소스 파일에 "디렉토리"목록을 작성하고 읽습니다. 평범하게 유지하십시오. 은 "불안"솔루션을

는 : http://www.uofr.net/~greg/java/get-resource-listing.html

+0

고마워, 내가 그걸 시도 할께! :) –

2

당신은 자원 /fonts/Open_Sans에 대한 InputStream를 엽니 다.

IDE에서 리소스를 실행하는 경우 디렉토리입니다. 그것은 그 디렉토리에있는 모든 파일의 목록을 반환한다는 것입니다.

jar 파일로 패키지 된 코드를 실행하면 리소스가 Jar 파일의 디렉토리 항목을 가리 킵니다. 해당 자원에 대한의 InputStream가 null가 아닌,하지만 당신은 그것에서 읽기 시작하면 NPE가 발생합니다 :

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) 

(당신이 getResourceAsStream에서 얻을 InputStream 인이 FilterInputStream를 확장하는 sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream이며이 소독하지 않는 그 나중에 NPE를 발생시키는 생성자 매개 변수).

+0

+1 -'그걸 모르는 것 같아요. 그 디렉토리에있는 모든 파일의 목록을 돌려줍니다 .' 나도 그걸 시도했을 때 나도 놀랐다 ... –

+0

네 전적으로 맞았습니다. 저는 방금 저의 예외 스택 추적을 살펴보고이를 적용했습니다. –

0

당신은 스트림을 다른 방법을 여는 것을 고려할 수 있습니다.나는 JAR 또는 자체에서 읽을 수있는 클래스 경로를 할 때, 나는이 체인을 사용

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

당신이 JAR 파일 또는 디렉토리 중 하나입니다 것을 일단

. 거기에서이 방법으로 리소스를 읽을 수 있습니다.

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(); 
}