为什么Java在尝试获取文件锁时会返回错误而不是IOException

为什么Java在尝试获取文件锁时会返回错误而不是IOException,java,nio,ioexception,Java,Nio,Ioexception,此代码在Windows 8.1上使用Java 1.8.07225.72-b15 64位运行 protected FileLock getFileLockForWriting(FileChannel fileChannel, String filePath) throws IOException { logger.finest("locking fileChannel for " + filePath); FileLock fileLock;

此代码在Windows 8.1上使用Java 1.8.07225.72-b15 64位运行

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
java.lang.Error:java.io.IOException:指定的服务器无法执行请求的操作
位于sun.nio.ch.FileKey.create(未知源)
位于sun.nio.ch.SharedFileLockTable。(来源未知)
位于sun.nio.ch.FileLockTable.newSharedFileLockTable(未知源)
位于sun.nio.ch.FileChannelImpl.fileLockTable(未知源)
位于sun.nio.ch.FileChannelImpl.tryLock(未知源)
位于java.nio.channels.FileChannel.tryLock(未知源)
在org.jaudiotager.tag.id3.AbstractID3v2Tag.getFileLockForWriting(AbstractID3v2Tag.java:1080)上
位于org.jaudiotager.tag.id3.AbstractID3v2Tag.writeBufferToFile(AbstractID3v2Tag.java:1462)
位于org.jaudiotager.tag.id3.ID3v23Tag.write(ID3v23Tag.java:751)
位于org.jaudiotagger.audio.mp3.MP3File.save(MP3File.java:1011)
位于org.jaudiotagger.audio.mp3.MP3File.save(MP3File.java:920)
位于org.jaudiotagger.audio.mp3.MP3File.commit(MP3File.java:932)
位于com.jthink.songkong.analysis.analysis.SongSaver.realSave(SongSaver.java:798)
位于com.jthink.songkong.analysis.analysis.SongSaver.saveSongToFile(SongSaver.java:623)
在com.jthink.songkong.analysis.analyzer.SongSaver.saveChanges上(SongSaver.java:185)
访问com.jthink.songkong.analysis.analysis.SongSaver.call(SongSaver.java:160)
访问com.jthink.songkong.analysis.analysis.SongSaver.call(SongSaver.java:54)
位于java.util.concurrent.FutureTask.run(未知源)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
位于java.lang.Thread.run(未知源)
原因:java.io.IOException:指定的服务器无法执行请求的操作
位于sun.nio.ch.FileKey.init(本机方法)
... 还有21个
它似乎返回了一个错误,因为不支持文件锁定,但它应该返回一个IOException(我的代码需要一个IOException),为什么会这样

更新
我想这是一个西方数字MyBook Live 3TBNAS,固件版本是02.43.10-048,运行Debian 5.0.4

上面的所有代码
FileKey。create
可以抛出
IOException
,因此您认为这种行为不正常是正确的

事实上,这已经作为一个文件提交。在Java 9中,
错误
将消失,取而代之的是
IOException


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

我猜这是由于访问权限造成的。哪个操作系统?根据stack trance,哪一行实际抛出异常?检查您试图锁定的实际文件路径。它可能是受保护的路径,例如“程序文件”或“程序文件(x86)”。您的用户可能没有相应的权限。另外,检查应用程序是否在异常发生后释放所有锁。我了解到,at sun.nio.ch.FileKey.create()由于sun.nio.ch.FileKey.init()引发的IOException而引发错误。Imm在Windows上运行,但该文件是NAS上的远程驱动器,我正在等待有关NAS的更多信息。我不明白为什么缺乏权限会导致这样的错误谢谢,我不清楚这个错误是否是从7 u40开始出现的