Почему InputStreamReader выдает ошибку NPE при чтении из jar?

Я пытаюсь перебирать файлы классов в известном каталоге, используя потоки. Конечная цель - получить имена классов для всех классов, которые существуют в конкретном пакете, затем загрузите классы во время выполнения и используйте отражение, чтобы получить имена и значения всех статических констант. Это работает, когда я запускаю программу из исходного кода на своей машине, но когда я запускаю ее как банку, BufferedReader выдает NPE из обоих ready () и readLine () . Вот код (с обработкой ошибок и передовыми методами опущены для краткости):

private void printClassNamesInPackage(final String strPackage) throws Exception {
    // The returned implementation of InputStream seems to be at fault
    final InputStream       packageStream = getClass().getClassLoader().getResourceAsStream( strPackage );
    final InputStreamReader streamReader  = new InputStreamReader( packageStream );
    final BufferedReader    reader        = new BufferedReader( streamReader );
    // Throws NPE from inside ready() - SEE STACKTRACE BELOW
    // reader.ready()
    String strLine;
    // Throws NPE from inside readLine() -  SEE STACKTRACE BELOW
    while ( null != (strLine = reader.readLine()) ) {
        System.out.println( strLine );
    }
}

Трассировка стека из reader.ready () :

java.lang.NullPointerException
    at java.io.FilterInputStream.available(FilterInputStream.java:142)
    at sun.nio.cs.StreamDecoder.inReady(StreamDecoder.java:343)
    at sun.nio.cs.StreamDecoder.implReady(StreamDecoder.java:351)
    at sun.nio.cs.StreamDecoder.ready(StreamDecoder.java:165)
    at java.io.InputStreamReader.ready(InputStreamReader.java:178)
    at java.io.BufferedReader.ready(BufferedReader.java:436)

Трассировка стека из reader.readLine () :

java.lang.NullPointerException
    at java.io.FilterInputStream.read(FilterInputStream.java:116)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)

Пошаговое выполнение показывает следующие реализации InputStream :

  • Из источника: java.io.ByteArrayInputStream
  • Из jar: sun.net.www.protocol .jar. JarURLConnection $ JarURLInputStream

При дальнейшем рассмотрении JarURLInputStream я обнаружил, что унаследованное (от FilterInputStream ) поле InputStream в равно null , что приводит к полученному NPE.

К сожалению, это все, что мне удалось в отладчике.

Есть идеи, как это правильно сделать? Что я упускаю или делаю не так? Спасибо!

6
задан Nate W. 16 May 2011 в 20:03
поделиться