2

tout le monde. Je code une fonction qui se connecte à un serveur en utilisant Class HttpURLConnection. Dans le code, j'établis une connexion, appelle les méthodes getOutputStream() et getInputStream() dans l'ordre. Ensuite, je déconnecte la connexion. Après cela, j'essaie d'obtenir des données qui ont été obtenues par la méthode getInputStream(), mais le compilateur rappelle NullPointerException.IOException: flux est fermé, NullPointerException avec HttpURLConnection se déconnecter

en code ci-dessous:

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(); 
      } 
     } 
    } 

Après les tentatives de débogage, Lorsque je déplace la ligne de déconnexion à la dernière ligne enfin module, tout sera ok. Mais je suis confus, ce qui arrive quand j'ai déjà attribué la valeur «inputstream» à «lecteur».

Merci beaucoup.

Répondre

0

L'attribution n'est pas égale à la lecture, reader.readLine() commence à lire à partir de la connexion.

InputStreamReader utilise la connexion pour lire des octets, vous déconnecter avant de lire les octets en utilisant la connexion

Un InputStreamReader est un pont de flux d'octets à caractère flux: Il lit les octets et ...

+0

Avant la déconnexion, l'objet inputstream est déjà dans la variable 'lecteur'. Cependant, lorsque je débogue, la méthode reader.readLine() obtient la nullpointexception. – phinux

+0

Mais vous n'avez rien lu, afin de lire la connexion devrait être ouverte parce que vous lisez en l'utilisant – user7294900

0

Rappelez-vous qu'il s'agit d'un "flux". Vous devez avoir une connexion active à lire depuis le flux. Fermez la connexion uniquement après avoir extrait vos données du flux.

+0

Je l'ai eu. Merci pour l'explication explicite. – phinux

0

Vous faites tout dans le mauvais ordre. Cela n'a pas de sens.

  1. Vous vous déconnectez puis vous vous attendez à pouvoir lire à partir de la connexion. Un non-sens total ici. Normalement, vous ne devriez pas vous déconnecter du tout, car vous interférez avec le pool de connexion HTTP. Retirez-le ou, si vous devez l'avoir, faites-le après toutes les fermetures. Vous fermez dans le mauvais ordre, mais vous n'avez pas besoin de fermer inStrReader du tout. La fermeture du BufferedReader fait cela. Il suffit de supprimer tout le code pour inStrReader.close(). Vous clôturez out deux fois Ne fais pas ça.

  2. connect() se produit implicitement. Vous n'avez pas besoin de l'appeler vous-même.

  3. new URL(url) est suffisant. Vous n'avez pas besoin de fournir le HTTPS Handler depuis environ 2003.

+0

Merci pour vos suggestions. Je conserve ce code uniquement à cause de la fortification HP (HP Enterprise Security Products). Si je supprime les méthodes close() dans le module finally, alors je recevrai des avertissements avec des ressources inédites: stream. – phinux

+0

Ensuite, ne déclarez pas 'InputStreamReader' comme une variable.Faites simplement 'new BufferedReader (new InputStreamReader (connection.getInputStream()," UTF-8 "))'. – EJP

+0

c'est le code initial, fortify rapporte des ressources inédites: stream. Ensuite, je déclare le InputStreamReader en tant que variable. – phinux