【问题标题】:How should I resolve java.lang.IllegalArgumentException: protocol = https host = null Exception?我应该如何解决 java.lang.IllegalArgumentException: protocol = https host = null 异常?
【发布时间】:2010-10-22 01:11:31
【问题描述】:

我正在开发一个 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 处遇到异常,

输出流 os = conn.getOutputStream();

例外是

java.lang.IllegalArgumentException: protocol = https host = null

这是什么原因?

【问题讨论】:

    标签: java exception ssl stream


    【解决方案1】:

    URL 使用正斜杠 (/),而不是反斜杠(如窗口)。试试:

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

    您收到错误的原因是 URL 类无法解析字符串的主机部分,因此 hostnull

    【讨论】:

      【解决方案2】:

      这段代码似乎完全没有必要:

      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,因为您在前面的语句中只是为变量分配了一个值,因此您将一个值分配给了 serverURLif (serverURLS != null) 不可能评估为 false
      4. 在上一行代码之外,您从未真正使用变量 serverURLS

      您可以将所有这些替换为:

      serverURL = new URL("https:\\\\abc.my.domain.com:55555\\update");
      

      【讨论】:

      • 嗨,我添加该行只是为了检查错误原因。实际上 URL 是使用消息过滤的。请注意,ServerURLs 的分配是一条测试线 :)
      【解决方案3】:

      可能会有所帮助 - 我来到这里是因为我错过了在 http: 之后放置两个 //。这就是我所拥有的:

      http://abc.my.domain.com:55555/update

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多