web-dev-qa-db-ja.com

Java.lang.IllegalArgumentExceptionを解決するにはどうすればよいですか:protocol = https Host = null Exception?

SSLクライアントサーバープログラムに取り組んでおり、次の方法を再利用する必要があります。

private boolean postMessage(String message){
    try{ 
         String serverURLS = getRecipientURL(message);

         serverURLS = "https:\\\\abc.my.domain.com:55555\\update";

         if (serverURLS != null){
             serverURL = new URL(serverURLS);
         }

        HttpsURLConnection conn = (HttpsURLConnection)serverURL.openConnection();

        conn.setHostnameVerifier(new HostnameVerifier() { 
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        } 
        });

        conn.setDoOutput(true);

        OutputStream os = conn.getOutputStream();

        OutputStreamWriter wr = new OutputStreamWriter(os);

        wr.write(message);

        wr.flush();

        if (conn.getResponseCode() != HttpsURLConnection.HTTP_OK)
            return false;
        else
            return true;

    }

ここでServerURLは次のように初期化されます

private URL serverURL = null;

このメソッドを実行しようとすると、Lineで例外が発生します。

OutputStream os = conn.getOutputStream();

例外は

Java.lang.IllegalArgumentException: protocol = https Host = null

これの理由は何ですか?

URLは、(ウィンドウとして)後方スラッシュではなく、前方スラッシュ(/)を使用します。試してください:

serverURLS = "https://abc.my.domain.com:55555/update";

エラーが発生する理由は、URLクラスが文字列のホスト部分を解析できないため、Hostnullであるためです。

19
Aaron Digulla

このコードは完全に不要のようです。

_String serverURLS = getRecipientURL(message);

serverURLS = "https:\\\\abc.my.domain.com:55555\\update";

if (serverURLS != null){
    serverURL = new URL(serverURLS);
}
_
  1. serverURLSにはgetRecipientURL(message)の結果が割り当てられます
  2. 次に、すぐにserverURLSの値を上書きして、前のステートメントを dead store にします。
  3. 次に、if (serverURLS != null)trueと評価されるため、justが前のステートメントで変数に値を割り当てたため、 serverURLに値を割り当てます。 if (serverURLS != null)falseに評価することは不可能です!
  4. 前のコード行を超えて変数serverURLSを実際に使用することはありません。

これらすべてを次のものに置き換えることができます。

_serverURL = new URL("https:\\\\abc.my.domain.com:55555\\update");
_
3
matt b