【问题标题】:JAVA NullpointerException FileInputStream(File file)JAVA NullpointerException FileInputStream(文件文件)
【发布时间】:2011-03-28 09:25:41
【问题描述】:

我有一个问题不能自己解决。
我是 JAVA 的大佬。

我不知道这个问题的解决方案。但我想我知道这个问题何时发生。 所以,我已经解决了这个问题。但我想要另一个解决方案,因为我的解决方案也有另一个问题。我必须减少处理时间。

  String intDir="C:\\RNE_IN";  

 while(true) {

        File interfaceDirectory = new File(intDir);
        String[] arrayfiles = interfaceDirectory.list(new FBMFileFilter());

        for(String f : arrayfiles){

    String filename = String.format("%1$s%2$s%3$s", intDir,File.separator,f);


        File file = new File(filename);

        FileInputStream stream = null;  

         System.out.println(file.canExecute());  // true    
         System.out.println(file.canRead());     // true    
    System.out.println(file.exists());   // true    
          System.out.println(file.isFile());     // true 
          System.out.println(file.length());    // call full bytes of file 


        // I can control NPE with this Thread sleep Time.         
        Thread.sleep(1);

        // It occurs when Stream is constructed in the below.         
        stream = new FileInputStream(file);



        FBMDeviceOnlyParser onlyparser = new FBMDeviceOnlyParser(); 

         onlyparser.ParseDeviceNameOnly(stream);    

        String onlydevice = onlyparser.getDeviceName();
        String onlystepseq = onlyparser.getStepSeq();
      }
    }               

在上面的sn-p中,我认为文件没有问题。 文件状态始终为真,并且 file.length 为全字节,无论异常。 但是,在无限循环时,如果我从另一个目录复制并粘贴到 intDir ,则会发生“NullPointerException”。

当 Thread.sleep(time) 超过 1000ms 时,NPE 不会发生。 由于处理时间,我想删除“Thread.sleep()”代码。

如果程序启动前intDir中有文件,则程序没有问题(不会发生NPE)

我想检查文件或 FileInputStream 状态是否不会发生 NPE。

感谢您的关心。

【问题讨论】:

  • 什么是堆栈跟踪?哪一行抛出 NPE?
  • 那么,您要解决的问题是什么?非工作代码是没有用的,因为它没有告诉我们代码的用途。请用文字而不是代码来解释您的问题
  • java.lang.NullPointerException at Apeiron.MainEntry.main(MainEntry.java:179) 线程“main”中的异常 java.lang.NullPointerException at Apeiron.MainEntry.main(MainEntry.java:260)
  • 一个带有 Thread.sleep 的“while(true)”循环来控制问题对我来说有点可疑。您是否知道您在该文件上打开了大量流?你想轮询文件还是你的意图是什么?
  • 在“Thread.sleep(1)”和“stream = new FileInputStream(file);”之间

标签: java nullpointerexception fileinputstream


【解决方案1】:

您的问题很难理解,但我可以告诉您一个事实,即不可能得到:

java.lang.NullPointerException at Apeiron.MainEntry.main(MainEntry.java:179) Exception in thread "main" 
java.lang.NullPointerException at Apeiron.MainEntry.main(MainEntry.java:260)

如果第 179 行是这一行:

stream = new FileInputStream(file);

必须是以下之一:

  • 你给了我们一个不完整的堆栈跟踪,或者
  • 您告诉我们异常的位置不正确,或者
  • 您实际上根本没有执行该代码;例如更改代码后,您没有正确重建代码。

【讨论】:

    【解决方案2】:

    您可能迟早会用完文件句柄。完成后关闭 FileInputstream。

    除此之外,请说明您真正想要对代码执行的操作(而不是将 CPU 使用率推到最高点)。

    【讨论】:

    • 文件描述符用完不会导致 NullPointerExceptions。
    • 你确定吗?至少在 Windows 上 fopen 会在错误时返回 NULL。我无法检查 FileInputStream(File) 调用的 FileInputStream.open(),因为它是本机的,但我认为有可能未检查 null 并抛出 NPE。在这种情况下你会期待什么? FileInputStream(File) 的 JavaDoc 仅提及 FileNotFoundException 和 SecurityException。两者都不合适,因此必须抛出其他类型的未经检查的异常。
    • 阿克塞尔 - 我很确定。 Java 构造函数不能返回null。永远不会。它要么返回一个非空对象引用,要么抛出一个异常。 (在本例中为 IOException 或子类。)
    • @Stephen:不,在这种情况下不能抛出 IOException,因为它是已检查的异常,并且没有为 FileInputStream(File) 声明。而且我没有说构造函数会返回null。但在内部,使用了一个文件描述符,它是从本地调用获得的,可以为 NULL(如在 C 中)。所以我们有一个不能为空的 FileDescriptor 对象,它包含一个文件描述符和一个从系统获得的句柄,两者都可以为空。我认为尝试使用其中任何一个时很有可能会抛出 NPE。
    • @Axel - 1) 堆栈跟踪显示异常是在 MainEntry 本身中引发的。 2) FileInputStream(File) 抛出 FileNotFoundException 这是IOException 的子类。 javadoc说它被抛出“如果文件不存在,是一个目录而不是一个常规文件,或由于某些其他原因无法打开阅读。”
    【解决方案3】:

    这个怎么样:

    String intDir="C:\\RNE_IN";  
    File interfaceDirectory = new File(intDir);
    while(true) {
      for(File file : interfaceDirectory.listFiles(new FBMFileFilter())) {
        System.out.println(file.canExecute());  // true    
        System.out.println(file.canRead());     // true    
        System.out.println(file.exists());      // true    
        System.out.println(file.isFile());      // true 
        System.out.println(file.length());      // call full bytes of file 
    
        final FileInputStream stream = new FileInputStream(file);
        try {
          FBMDeviceOnlyParser onlyparser = new FBMDeviceOnlyParser(); 
          onlyparser.ParseDeviceNameOnly(stream);    
          String onlydevice = onlyparser.getDeviceName();
          String onlystepseq = onlyparser.getStepSeq();
        } finally {
          stream.close();
        }
      }
    }
    

    我做了几件事—— 1.摆脱不必要的文件名生成 2.最后尝试释放文件句柄资源

    顺便说一句,我猜你的睡眠允许终结器运行。

    【讨论】:

    • @Jini,如果这个答案解决了你的问题,请接受它。
    猜你喜欢
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多