2017-01-28 12 views
0

計算を実行する前にファイルが存在するかどうかをチェックするスレッドがあります。ファイルが存在するかどうかを調べるスレッドNullPointerExceptionをスローする

FileSystem fs = ... 
Path filenamePath = new Path(file.getID() + "file.txt"); 
try { 
    while(!fs.exists(filenamePath)){ 
     Thread.sleep(1000); 
    } 
} catch (InterruptedException e){ 
    } 

問題は、私のスレッドがエラーNulPointerExceptionを投げ、決して中断されたということです。 nullfilenamePathnullであることを除き例外です。この場合、私は何をすべきですか?私は何か間違っているのですか?スタックトレースは、ライン

ERROR [CheckFilesThread] compute.files.app.FirstApp: Exception in CheckFilesThread 
java.lang.NullPointerException 
    at compute.files.app.FirstApp$CheckFilesThread.run(FirstApp.java:211) 
を示す以外に有用何も表示されません

+0

*この場合はどうしたらいいですか?* - 正しいファイルパスを指定してください。 – nullpointer

+0

@nullpointer条件が満たされた場合、ファイルは別のスレッドによって作成されます。上記のスレッドは、 'file.txt'が作成された場合に何らかの計算を行います。 – Self

+0

@DavidWallaceはい。編集されました。いいえ、これは問題ではありません。 – Self

答えて

-1

Iウォッチャーを使用して良いアイデアだと思う:ファイルがあるとき、あなたはあなたのスレッドをトリガすることができます

Path dir = ...; 
try { 
    WatchKey key = dir.register(watcher, 
          ENTRY_CREATE, 
          ENTRY_DELETE, 
          ENTRY_MODIFY); 
} catch (IOException x) { 
    System.err.println(x); 
} 

作成した。ここでfilenamePathがnullであるため、nullの例外があるいくつかのより多くのdocumentation

-1
 @SuppressWarnings("unchecked") 
     public static void watchDirectoryPath(Path path,String fileToWatch) { 

      try { 
       Boolean isFolder = (Boolean) Files.getAttribute(path, "basic:isDirectory", NOFOLLOW_LINKS); 
       if (!isFolder) { 
        throw new IllegalArgumentException("Path: " + path + " is not a folder"); 
       } 
      } catch (IOException ioe) { 

       ioe.printStackTrace(); 
      } 

      System.out.println("Watching path: " + path); 

      // We obtain the file system of the Path 
      FileSystem fs = path.getFileSystem(); 

      // We create the new WatchService using the new try() block 
      try (WatchService service = fs.newWatchService()) { 

       // We register the path to the service 
       // We watch for creation events 
       path.register(service,StandardWatchEventKinds.ENTRY_CREATE); 

       // Start the infinite polling loop 
       WatchKey key = null; 
       while (true) { 
        Path newPath=null; 
        key = service.take(); 

        // Dequeueing events 
        Kind<?> kind = null; 
        for (WatchEvent<?> watchEvent : key.pollEvents()) { 
         // Get the type of the event 
         kind = watchEvent.kind(); 
         if (StandardWatchEventKinds.OVERFLOW== kind) { 
          continue; // loop 
         } else if(StandardWatchEventKinds.ENTRY_CREATE== kind) { 
          // A new Path was created 
          newPath = ((WatchEvent<Path>) watchEvent).context(); 

         } 
        } 

        if (!key.reset() || newPath.toString().equals(fileToWatch)) { 
         break; // loop 
        } 
       } 

      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } catch (InterruptedException ie) { 
       ie.printStackTrace(); 
      } 

     } 

    Path folder = Paths.get.. 
    watchDirectoryPath(folder,"file.txt"); 
0

です。

いいえ、それ以外の場合、スタックトレースにはFileSystem.exists()が含まれます。はnullです。あなたが明らかに他のものに初期化していないからです。

そうでなければ、これは実際のコードではありません。この場合、皆さんの時間を無駄にしてしまいます。

+0

私があなたに言いましたように、間違いがありました。 'file.getID()'が 'null'だったので' null'です。とにかくありがとうございました! – Self

関連する問題