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

标签 java nio ioexception

此代码在 Windows 8.1 上使用 Java 1.8.0_72 25.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

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

更新 我的案例是西部数据 MyBook Live 3TBNAS,固件版本是 02.43.10-048,运行 Debian 5.0.4

最佳答案

FileKey.create 上面的所有代码都可以抛出 IOException,因此您认为此行为不正确的假设是正确的。

事实上,这已经被归档为 bug 。在 Java 9 中,Error 将消失,IOException 将是 thrown相反。

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

关于java - 为什么 Java 在尝试获取文件锁时返回错误而不是 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35727180/

相关文章:

java - 如何在java中单击按钮时暂停线程

java - 字符串和文本文件匹配非常基本

java - 使用Java NIO 10000个并发连接

file - 如何导入java.nio.file包

java - HttpURLConnection:如何读取 400 响应的有效负载

java - Android Java - 当 flush() 到服务器时出现 IOException

java - 显示来自SD卡的jpg android

java - 如何将图像转换为字节数组以及将字节数组转换回图像

Java NIO : Sending more than 16 objects causes error

android - 好的http。异常 java.io.IOException : unexpected end of stream on Connection