/**
   * Creates a new URL instance using the given arguments. The URL uses the specified port instead
   * of the default port for the given protocol.
   *
   * @param protocol the protocol of the new URL.
   * @param host the host name or IP address of the new URL.
   * @param port the specific port number of the URL. {@code -1} represents the default port of the
   *     protocol.
   * @param file the name of the resource.
   * @param handler the stream handler to be used by this URL.
   * @throws IOException if the combination of all arguments do not represent a valid URL or the
   *     protocol is invalid.
   * @throws SecurityException if {@code handler} is non-{@code null}, and a security manager is
   *     installed that disallows user-defined protocol handlers.
   */
  public URL(String protocol, String host, int port, String file) throws IOException {
    if (port < -1) {
      throw new IOException("Port out of range: " + port);
    }

    if (host != null && host.indexOf(":") != -1 && host.charAt(0) != '[') {
      host = "[" + host + "]";
    }

    if (protocol == null) {
      throw new NullPointerException("Unknown protocol: null");
    }

    this.protocol = protocol;
    this.host = host;
    this.port = port;

    // Set the fields from the arguments. Handle the case where the
    // passed in "file" includes both a file and a reference part.
    int index = -1;
    index = file.indexOf("#", file.lastIndexOf("/"));
    if (index >= 0) {
      this.file = file.substring(0, index);
      ref = file.substring(index + 1);
    } else {
      this.file = file;
    }
    fixURL(false);
  }
 /**
  * Sets the properties of this URL using the provided arguments. Only a {@code URLStreamHandler}
  * can use this method to set fields of the existing URL instance. A URL is generally constant.
  *
  * @param protocol the protocol to be set.
  * @param host the host name to be set.
  * @param port the port number to be set.
  * @param file the file to be set.
  * @param ref the reference to be set.
  */
 protected void set(String protocol, String host, int port, String file, String ref) {
   if (this.protocol == null) {
     this.protocol = protocol;
   }
   this.host = host;
   this.file = file;
   this.port = port;
   this.ref = ref;
   hashCode = 0;
   fixURL(true);
 }