changeset 57812:34138fe5f9f7

8235783: DatagramSocket::disconnect should allow an implementation to throw UncheckedIOException Summary: Undocumented throwing of Errors changed to throw a more user friendly UncheckedIOException Reviewed-by: alanb, chegar, dfuchs
author pconcannon
date Thu, 23 Jan 2020 14:43:37 +0000
parents 64a3594e98cc
children 36e49db57f6d
files src/java.base/share/classes/java/net/DatagramSocket.java src/java.base/share/classes/sun/nio/ch/DatagramSocketAdaptor.java
diffstat 2 files changed, 33 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.base/share/classes/java/net/DatagramSocket.java	Thu Jan 23 15:13:32 2020 +0100
+++ b/src/java.base/share/classes/java/net/DatagramSocket.java	Thu Jan 23 14:43:37 2020 +0000
@@ -26,6 +26,7 @@
 package java.net;
 
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.nio.channels.DatagramChannel;
 import java.security.AccessController;
 import java.security.PrivilegedExceptionAction;
@@ -464,13 +465,17 @@
      * Connects the socket to a remote address for this socket. When a
      * socket is connected to a remote address, packets may only be
      * sent to or received from that address. By default a datagram
-     * socket is not connected.
+     * socket is not connected. If the socket is already closed,
+     * then this method has no effect.
      *
-     * <p>If the remote destination to which the socket is connected does not
-     * exist, or is otherwise unreachable, and if an ICMP destination unreachable
-     * packet has been received for that address, then a subsequent call to
-     * send or receive may throw a PortUnreachableException. Note, there is no
-     * guarantee that the exception will be thrown.
+     * <p> If this socket is not bound then this method will first cause the
+     * socket to be bound to an address that is assigned automatically,
+     * as if invoking the {@link #bind bind} method with a parameter of
+     * {@code null}. If the remote destination to which the socket is connected
+     * does not exist, or is otherwise unreachable, and if an ICMP destination
+     * unreachable packet has been received for that address, then a subsequent
+     * call to send or receive may throw a PortUnreachableException. Note,
+     * there is no guarantee that the exception will be thrown.
      *
      * <p> If a security manager has been installed then it is invoked to check
      * access to the remote address. Specifically, if the given {@code address}
@@ -506,14 +511,19 @@
      *         if a security manager has been installed and it does
      *         not permit access to the given remote address
      *
+     * @throws UncheckedIOException
+     *         may be thrown if connect fails, for example, if the
+     *         destination address is non-routable
+     *
      * @see #disconnect
+     *
      * @since 1.2
      */
     public void connect(InetAddress address, int port) {
         try {
             connectInternal(address, port);
         } catch (SocketException se) {
-            throw new Error("connect failed", se);
+            throw new UncheckedIOException("connect failed", se);
         }
     }
 
@@ -522,7 +532,9 @@
      *
      * <p> If given an {@link InetSocketAddress InetSocketAddress}, this method
      * behaves as if invoking {@link #connect(InetAddress,int) connect(InetAddress,int)}
-     * with the given socket addresses IP address and port number.
+     * with the given socket addresses IP address and port number, except that the
+     * {@code SocketException} that may be raised is not wrapped in an
+     * {@code UncheckedIOException}.
      *
      * @param   addr    The remote address.
      *
@@ -554,7 +566,17 @@
      * Disconnects the socket. If the socket is closed or not connected,
      * then this method has no effect.
      *
+     * @apiNote If this method throws an UncheckedIOException, the socket
+     *          may be left in an unspecified state. It is strongly
+     *          recommended that the socket be closed when disconnect
+     *          fails.
+     *
+     * @throws  UncheckedIOException
+     *          may be thrown if disconnect fails to dissolve the
+     *          association and restore the socket to a consistent state.
+     *
      * @see #connect
+     *
      * @since 1.2
      */
     public void disconnect() {
--- a/src/java.base/share/classes/sun/nio/ch/DatagramSocketAdaptor.java	Thu Jan 23 15:13:32 2020 +0100
+++ b/src/java.base/share/classes/sun/nio/ch/DatagramSocketAdaptor.java	Thu Jan 23 14:43:37 2020 +0000
@@ -26,6 +26,7 @@
 package sun.nio.ch;
 
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodHandles.Lookup;
@@ -116,7 +117,7 @@
         try {
             connectInternal(new InetSocketAddress(address, port));
         } catch (SocketException x) {
-            throw new Error(x);
+            throw new UncheckedIOException(x);
         }
     }
 
@@ -132,7 +133,7 @@
         try {
             dc.disconnect();
         } catch (IOException x) {
-            throw new Error(x);
+            throw new UncheckedIOException(x);
         }
     }