2017-01-28 46 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和永遠不會被打斷。由於filenamePathnull,所以該異常爲null。在這種情況下我該怎麼辦?難道我做錯了什麼?

堆棧跟蹤不顯示任何有用的東西,除了顯示線

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

我認爲使用Watcher是一個更好的主意:

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

你可以觸發你的線程當一個文件創建。下面是一些更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

空的例外是因爲filenamePath爲空。

否。否則,堆棧跟蹤將包括FileSystem.exists()。這是fs,它是空的,因爲你顯然沒有將它初始化爲其他任何東西。

否則這不是真正的代碼,在這種情況下,你只是在浪費每個人的時間,這是不值得讚賞的。

+0

正如我提到你,有一個錯誤。 'null'是因爲'file.getID()'爲'null'。不管怎樣,謝謝你! – Self