2016-03-01 41 views
2

此代码与Java 1.8.0_72 25.72-B15 64位Windows上运行8.1为什么Java返回一个错误,而不是一个IOException异常时尝试并获得文件锁

protected FileLock getFileLockForWriting(FileChannel fileChannel, String filePath) throws IOException 
    { 
     logger.finest("locking fileChannel for " + filePath); 
     FileLock fileLock; 
     try 
     { 
      fileLock = fileChannel.tryLock(); 
     } 
     //Assumes locking is not supported on this platform so just returns null 
     catch (IOException exception) 
     { 
      return null; 
     } 

     //Couldnt getFields lock because file is already locked by another application 
     if (fileLock == null) 
     { 
      throw new IOException(ErrorMessage.GENERAL_WRITE_FAILED_FILE_LOCKED.getMsg(filePath)); 
     } 
     return fileLock; 
    } 

报告这种错误特定用户

java.lang.Error: java.io.IOException: The specified server cannot perform the requested operation 
    at sun.nio.ch.FileKey.create(Unknown Source) 
    at sun.nio.ch.SharedFileLockTable.<init>(Unknown Source) 
    at sun.nio.ch.FileLockTable.newSharedFileLockTable(Unknown Source) 
    at sun.nio.ch.FileChannelImpl.fileLockTable(Unknown Source) 
    at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source) 
    at java.nio.channels.FileChannel.tryLock(Unknown Source) 
    at org.jaudiotagger.tag.id3.AbstractID3v2Tag.getFileLockForWriting(AbstractID3v2Tag.java:1080) 
    at org.jaudiotagger.tag.id3.AbstractID3v2Tag.writeBufferToFile(AbstractID3v2Tag.java:1462) 
    at org.jaudiotagger.tag.id3.ID3v23Tag.write(ID3v23Tag.java:751) 
    at org.jaudiotagger.audio.mp3.MP3File.save(MP3File.java:1011) 
    at org.jaudiotagger.audio.mp3.MP3File.save(MP3File.java:920) 
    at org.jaudiotagger.audio.mp3.MP3File.commit(MP3File.java:932) 
    at com.jthink.songkong.analyse.analyser.SongSaver.realSave(SongSaver.java:798) 
    at com.jthink.songkong.analyse.analyser.SongSaver.saveSongToFile(SongSaver.java:623) 
    at com.jthink.songkong.analyse.analyser.SongSaver.saveChanges(SongSaver.java:185) 
    at com.jthink.songkong.analyse.analyser.SongSaver.call(SongSaver.java:160) 
    at com.jthink.songkong.analyse.analyser.SongSaver.call(SongSaver.java:54) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.io.IOException: The specified server cannot perform the requested operation 
    at sun.nio.ch.FileKey.init(Native Method) 
    ... 21 more 

看来它返回一个错误,因为不支持文件锁定,但它应该返回一个IOException,(我的代码需要一个IOException),为什么会这样

更新 我的情况下相应和它的西数MyBook直播3TBNAS,固件版本为02.43.10-048其运行Debian 5.0.4

+1

我想这是由于访问权限。哪个OS? – kosa

+1

根据堆栈恍惚,哪一行实际上是抛出异常? – markspace

+0

检查您试图锁定的实际文件路径。它可能是受保护的路径,如“Program Files”或“Program Files(x86)”。无论如何,您的用户可能没有适当的权限。另外,请检查您的应用程序是否在异常发生后释放锁。 – ManoDestra

回答

3

上述FileKey.create的所有代码都可以抛出IOException所以你的假设,这种行为是不是好的是正确的。

事实上,这已经被提交为bug。在Java 9中,Error将消失,IOException将代替thrown

因此,现在您应该准备好捕获错误并评估内部IOException。

+0

谢谢,我不明白,如果这个错误只是自7以来才引入u40 –

相关问题