JDK-8279984 : (ch) java.nio.channels.FileChannel tryLock and write methods are missing @throws NonWritableChannelException
  • Type: CSR
  • Component: core-libs
  • Sub-Component: java.nio
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 19
  • Submitted: 2022-01-13
  • Updated: 2022-01-24
  • Resolved: 2022-01-24
Related Reports
CSR :  
Description
Summary
-------

Add `@throws NonWritableChannelException` to the `tryLock()` and `write()` methods of `java.nio.channels.FileChannel`.

Problem
-------

If a `tryLock()` or `write()` method is invoked on a `java.nio.channels.FileChannel` which has been opened with read-only access, then a `java.nio.channels.NonWritableChannelException` is thrown but the documentation does not indicate this.

Solution
--------

Add `@throws NonWritableChannelException` to the indicated methods.

Specification
-------------
Note that for `tryLock(long,long,boolean)`, the `boolean` parameter `shared` is referred to. The other `@throws` are all the same and do not mention any parameter.

    @@ -403,6 +406,9 @@ public abstract class FileChannel
          * with the number of bytes actually written.  Otherwise this method
          * behaves exactly as specified by the {@link WritableByteChannel}
          * interface. </p>
    +     *
    +     * @throws  NonWritableChannelException
    +     *          If this channel was not opened for writing
          */
         public abstract int write(ByteBuffer src) throws IOException;
     
    @@ -417,6 +423,9 @@ public abstract class FileChannel
          * with the number of bytes actually written.  Otherwise this method
          * behaves exactly as specified in the {@link GatheringByteChannel}
          * interface.  </p>
    +     *
    +     * @throws  NonWritableChannelException
    +     *          If this channel was not opened for writing
          */
         public abstract long write(ByteBuffer[] srcs, int offset, int length)
             throws IOException;
    @@ -431,6 +440,9 @@ public abstract class FileChannel
          * with the number of bytes actually written.  Otherwise this method
          * behaves exactly as specified in the {@link GatheringByteChannel}
          * interface.  </p>
    +     *
    +     * @throws  NonWritableChannelException
    +     *          If this channel was not opened for writing
          */
         public final long write(ByteBuffer[] srcs) throws IOException {
             return write(srcs, 0, srcs.length);
    @@ -1030,7 +1042,7 @@ public abstract class FileChannel
          *          region
          *
          * @throws  NonReadableChannelException
    -     *          If {@code shared} is {@code true} this channel was not
    +     *          If {@code shared} is {@code true} but this channel was not
          *          opened for reading
          *
          * @throws  NonWritableChannelException
    @@ -1148,6 +1160,14 @@ public abstract class FileChannel
          *          blocked in this method and is attempting to lock an overlapping
          *          region of the same file
          *
    +     * @throws  NonReadableChannelException
    +     *          If {@code shared} is {@code true} but this channel was not
    +     *          opened for reading
    +     *
    +     * @throws  NonWritableChannelException
    +     *          If {@code shared} is {@code false} but this channel was not
    +     *          opened for writing
    +     *
          * @throws  IOException
          *          If some other I/O error occurs
          *
    @@ -1180,6 +1200,9 @@ public abstract class FileChannel
          *          blocked in this method and is attempting to lock an overlapping
          *          region
          *
    +     * @throws  NonWritableChannelException
    +     *          If this channel was not opened for writing
    +     *
          * @throws  IOException
          *          If some other I/O error occurs
          *


Comments
Moving to Approved.
24-01-2022