从目录资源流中读取时的NPE

时间:2015-07-17 09:27:07

标签: java jar classloader

我试图从我的jar文件中获取资源目录中的资源文件列表并遇到一些奇怪的行为。使用URLClassLoader加载jar,该文件正在加载4个不同的.jar文件。

我正在做以下事情:

    // Read the list of files from the resources/devices folder
    InputStream is = resourceClass.getClassLoader().getResourceAsStream("myPackage/resources/devices");

    InputStreamReader isReader = new InputStreamReader(is);
    BufferedReader reader = new BufferedReader(isReader);
    String str;

    try {
        str = reader.readLine();
     ...

当我从包含资源的.jar在IDE中运行应用程序时,一切都按预期工作100%,我从.jar文件中的文件夹中获取文件列表。当我更改(中断)路径时,“是”为空(在我的应用程序中我当然检查所有这些)并且它安全返回。

然而,当我从加载应用程序或命令行运行它时,readLine会抛出一个NPE。

我无法解释这一点,因为在调试器中我可以清楚地看到“is”不是null(找到资源)和“isReader”和“reader”也看起来很好,所以它似乎只是打开流细

当代码工作时,我可以在调试器中看到流中的字节,但是当NPE的时候,我只能看到流中的空白。看看权限这似乎很好,而且如果特权是一个问题,它甚至不应该返回“是”。

那么这里发生了什么?我如何弄清楚导致NPE的原因?

编辑:这是NPE的完整堆栈跟踪。

java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.microchip.mcc.mcu8.Mcu8PeripheralLibrary.getDeviceNameList(Mcu8PeripheralLibrary.java:47)
at com.microchip.mcc.mcu8.Mcu8PeripheralLibrary.getDevices(Mcu8PeripheralLibrary.java:27)
at com.microchip.mcc.core.service.BaseDeviceService.getDevices(BaseDeviceService.java:29)
at com.microchip.mcc.standalone.StandaloneViewer.populateDevices(StandaloneViewer.java:192)
at com.microchip.mcc.standalone.StandaloneViewer.initialize(StandaloneViewer.java:73)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2223)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2069)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2830)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2809)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2795)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2782)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2771)
at com.microchip.mcc.standalone.Standalone.start(Standalone.java:32)
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:219)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:182)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:179)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)

0 个答案:

没有答案