2

everyone。クラスHttpURLConnectionを使用してサーバーに接続する関数をコーディングしています。コードでは、接続を確立し、getOutputStream()メソッドとgetInputStream()メソッドを順番に呼び出します。次に、接続を切断します。この後、getInputStream()メソッドで取得したデータを取得しようとしますが、コンパイラはNullPointerExceptionを思い出させます。以下でIOException:ストリームが閉じている、HttpURLConnectionを使用したNullPointerExceptionの接続が切断されている

コード:私は最終的にモジュール内の最後の行に切断線を移動すると、デバッグしようとした後

DataOutputStream out = null; 
    InputStreamReader inStrReader = null; 
    BufferedReader reader = null; 
    HttpURLConnection connection = null; 

    try { 
     URL postUrl = new URL(null, url, new sun.net.www.protocol.https.Handler()); 
     connection = (HttpURLConnection) postUrl.openConnection(); 
     ...//some setting methods 
     connection.connect(); 
     out = new DataOutputStream(connection.getOutputStream()); 
     out.writeBytes(JSONObject.toJSONString(param)); 
     out.flush(); 
     out.close(); 

     inStrReader = new InputStreamReader(connection.getInputStream(), "utf-8"); 
     reader = new BufferedReader(inStrReader); 
     connection.disconnect(); //<--HERE, release the connection 
     StringBuilder stringBuilder = new StringBuilder(); 
     for (String line = reader.readLine(); line != null; line = reader.readLine()) {  //<--null pointer 
      stringBuilder.append(line); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } finally { 
     if (out != null) { 
      try { 
       out.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (inStrReader != null) { 
      try { 
       inStrReader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

、すべてがOKになります。しかし、私は混乱しています。私はすでに 'リーダー'に 'インプットストリーム'の価値を託しています。

ありがとうございます。

答えて

0

割り当ては読み込みと同じではありません。reader.readLine()接続から読み込みを開始します。

InputStreamReader

は、それが

アンInputStreamReaderのは文字 ストリームにバイトストリームからブリッジで接続を使用してバイトを読む前に外して、バイトを読み取るために接続を使用している:それはバイトを読み込み、...

+0

接続を切断する前に、すでに入力ストリームオブジェクトを変数 'reader'に取得しています。しかし、私がデバッグすると、reader.readLine()メソッドはnullpointexceptionを取得します。 – phinux

+0

しかし、あなたはそれを使用して読んでいるので、接続を開く必要があります読むために何かを読んでいない – user7294900

0

「ストリーム」であることを覚えておいてください。ストリームから読み込むにはアクティブな接続が必要です。ストリームからデータを取得した後にのみ接続を閉じます。

+0

私はそれを持っています。明白な説明をありがとう。 – phinux

0

あなたは間違った順序ですべてをやっています。それは意味をなさない。

  1. あなたは接続を解除してから接続を読み取ることができます。ここで全然ナンセンス。通常は、HTTP接続プーリングを妨げるため、接続を切断しないでください。ただそれを取り除くか、それを持っていなければならない場合は、すべての終了後にやりなさい。

  2. 間違った順序で閉じるが、閉じる必要はありません。inStrReaderBufferedReaderを締めてください。 inStrReader.close()のコードをすべて削除してください。

  3. あなたはoutを2回閉店しています。それをしないでください。

  4. connect()が暗黙的に発生します。あなたはそれを自分で呼び出す必要はありません。

  5. new URL(url)で十分です。

+0

あなたの提案のためのThx。 HPのセキュリティ強化製品(HPエンタープライズセキュリティ製品)のためにこのコードを維持しています。私が最後のモジュールでclose()メソッドを削除すると、リリースされていないリソース(ストリーム)に関する警告が表示されます。 – phinux

+0

次に、 'InputStreamReader'を変数として宣言しないでください。単に新しいBufferedReader(新しいInputStreamReader(connection.getInputStream()、 "UTF-8")) 'を実行してください。 – EJP

+0

は、初期コードです。fortifyは、リリースされていないリソース(ストリーム)を報告します。次に、InputStreamReaderを変数として宣言します。 – phinux

関連する問題