【问题标题】:FileInputStream NullpointerExceptionFileInputStream NullpointerException
【发布时间】:2011-11-11 09:20:56
【问题描述】:

我正在尝试读取属性文件/res/version.num。 但我得到的只是一个 NPE。

try {
    URL url = getClass().getResource("/res/version.num");
    logger.writeLog(JammEnum.INFO, "version.num path: " + url.getPath());
    File prop_file = new File(url.getPath());
    FileInputStream fis = new FileInputStream(prop_file);
    prop.load(fis);
    fis.close();
} 
catch (FileNotFoundException e) {
    logger.writeLog(JammEnum.ERROR, "File not found: version.num");
    e.printStackTrace();
} 
catch (IOException e) {
    logger.writeLog(JammEnum.ERROR, "Cannot read version.num");
    e.printStackTrace();
}

输出是:

(II) - version.num path: /home/andreas/Programmieren/Java/Jamm/bin/res/version.num
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at jamm.gui.InfoGui.<init>(InfoGui.java:83)
    at jamm.gui.FinanzmanagerGui$ButtonInfoListener.actionPerformed(FinanzmanagerGui.java:553)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6504)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6269)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4860)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4686)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2713)
    at java.awt.Component.dispatchEvent(Component.java:4686)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:680)
    at java.awt.EventQueue$4.run(EventQueue.java:678)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

第 83 行是:FileInputStream fis = new FileInputStream(prop_file);

文件的路径记录正确。但是为什么我会得到这个异常?

【问题讨论】:

    标签: java java-io


    【解决方案1】:

    试试这个例子。

    $ cat src/PrintVersion.java 
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * @author peter.lawrey
     */
    public class PrintVersion {
        public static void main(String... args) throws IOException {
            InputStream is = PrintVersion.class.getClassLoader().getResourceAsStream("res/version.num");
            String version = asString(is);
            System.out.println("Version: "+version);
        }
    
        public static String asString(InputStream is) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            for(int len; (len = is.read(bytes))>0;)
                baos.write(bytes, 0, len);
            return baos.toString();
        }
    }
    $ cat src/res/version.num 
    version 1.0
    $ javac src/PrintVersion.java
    $ ls src
    PrintVersion.class  PrintVersion.java  res
    $ java -cp src PrintVersion
    Version: version 1.0
    

    url 为空,因为它找不到资源。即使它不为空,这也不是获取文件的正确方法,因为它仅在文件位于文件系统上时才有效。

    你应该试试

    InputStream is = getClass().getClassLoader()
                     .getResourceAsInputStream("/res/version.num");
    

    【讨论】:

    • 感谢您的回答。但我仍然得到这个 NPE。路径是否正确?抱歉所有这些问题,我在编码方面很新。目前我的文件在“项目”/src/res/version.num
    • 您提供的路径必须与您的类路径相关。例如如果target/classes/ 在您的类路径中,则需要在名为 res 的子目录中。即target/classes/res/version.num
    • 多环芳烃。我无法让它工作。我的文件夹结构是HERE,这是我的.classpath 和当前代码HERE
    • 我怀疑您需要从路径中删除前导“/”。这在 Tomcat 中对我有用,但在纯 Java 中可能不起作用。看我的例子。
    • 谢谢,谢谢,谢谢,……真是个愚蠢的错误!我正在寻找几个小时:( 1000x 再次感谢
    【解决方案2】:

    您需要使用ClassLoader.getResourceAsStream(),而不是 FileInputStream。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多