HOWTO · Java

Java での java.net.ConnectException エラー

このチュートリアルでは、Java の java.net.ConnectException エラーについて説明します。

このページの内容

このチュートリアルでは、Java の java.net.ConnectException エラーについて説明します。

Java での java.net.ConnectException エラー

java.net.ConnectException は、ネットワークを使用しているときに最も一般的な例外です。 ほとんどの場合、クライアント、アプリケーション、およびサーバー間で TCP 接続を確立するときに発生します。

これは、try-catch ブロックを使用してコードで処理できるチェック済みアプリケーションです。 この例外は、IO 例外のサブクラスです。

この例外の階層は次のとおりです。

     java.lang.Object
        java.lang.Throwable
            java.lang.Exception
                java.io.IOException
                    java.net.SocketException
                        java.net.ConnectException

この例外の考えられる理由は次のとおりです。

  1. クライアントとサーバーが同じネットワークにない場合、両方ともインターネットやLANなどのネットワークにある必要があります。 それ以外の場合は、ConnectException がスローされます。
  2. サーバーが稼働していないとき。 通常、3306 (MySQL)、8080 (Tomcat 用)、27017 (MongoDB)、3000 または 4200 (React/Angular 用) などのポートは完全にダウンしているか、他のエンティティによって占有されており、ConnectException をスローします。
  3. ファイアウォールの場合など、セキュリティが通信を禁止している場合。 この場合、ConnectException がスローされます。
  4. 設定が上書きされると、サーバーは実行されている可能性がありますが、ポートにリストされている場合、ConnectException がスローされます。
  5. 接続文字列が正しくない場合、例えば Connection DemoConnection = DriverManager.getConnection("jdbc:mysql://localhost/:3306<databasename>?" + "user=<username>&password=<password>"); がスローされます。
  6. 誤って間違ったポート番号を指定した場合、ConnectException をスローします。

ConnectException の例を試してみましょう:

package delftstack;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;
import java.util.*;

public class Example {
  public static void main(String[] args) throws IOException {
    String Host_Name = "127.0.0.1";
    int Port_Number = 808;

    Socket New_Socket = new Socket(Host_Name, Port_Number);

    InputStream Input_Stream = New_Socket.getInputStream();
    InputStreamReader Input_Stream_Reader = new InputStreamReader(Input_Stream);
    int Demo_Data;

    StringBuilder Output_String = new StringBuilder();
    while ((Demo_Data = Input_Stream_Reader.read()) != -1) {
      Output_String.append((char) Demo_Data);
    }
  }
}

上記のコードは、ポートと IP が無効であるため、ConnectException をスローします。 出力を参照してください:

Exception in thread "main" java.net.ConnectException: Connection refused: connect
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:579)
    at java.base/sun.nio.ch.Net.connect(Net.java:568)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
    at java.base/java.net.Socket.connect(Socket.java:633)
    at java.base/java.net.Socket.connect(Socket.java:583)
    at java.base/java.net.Socket.<init>(Socket.java:507)
    at java.base/java.net.Socket.<init>(Socket.java:287)
    at delftstack.Example.main(Example.java:16)

これで、try-catch ブロックを使用して例外を処理できます。 チェック例外であるため、メソッドに throws を追加する必要があります。

解決策を見てみましょう:

package delftstack;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;
import java.util.*;

public class Example {
  public static void main(String[] args) throws IOException {
    String Host_Name = "127.0.0.1";
    int Port_Number = 808;

    try (Socket New_Socket = new Socket(Host_Name, Port_Number)) {
      InputStream Input_Stream = New_Socket.getInputStream();
      InputStreamReader Input_Stream_Reader = new InputStreamReader(Input_Stream);
      int Demo_Data;

      StringBuilder Output_String = new StringBuilder();
      while ((Demo_Data = Input_Stream_Reader.read()) != -1) {
        Output_String.append((char) Demo_Data);
      }
    }

    catch (ConnectException ex) {
      System.out.println(
          "The Connect Exception  occured becuase the given hostname and port are invalid : "
          + ex.getMessage());
    }
  }
}

例外が処理されるようになったため、コードがクラッシュすることはありません。 出力を参照してください:

The Connect Exception  occured becuase the given hostname and port are invalid : Connection refused: connect