2013-08-14 2 views
0

InputStreamReader lève un NPE comme suit lorsque j'exécute ce code à la deuxième itération de la boucle for. Le code fonctionne parfaitement pour la première itération et renvoie le NPE suivant à la deuxième itération. J'utilise l'extrait de code pour lire le contenu d'un fichier spécifique à partir d'un emplacement FTP et les afficher. S'il vous plaît noter toutes les lignes jusqu'à ce que le nouveau InputStreamReader fonctionne parfaitement même sur la deuxième itération. Des idées pourquoi?InputStreamReader lève NPE à la deuxième itération de la boucle for

Exception in thread "main" java.lang.NullPointerException 
at java.io.Reader.<init>(Reader.java:61) 
at java.io.InputStreamReader.<init>(InputStreamReader.java:55) 
at com.test.txtweb.server.task.CallBackRetryTask.main(CallBackRetryTask.java:229) 

Voici le code source:

public static void main(String[] args){ 
    String strDate = "20130805"; 

    FTPClient ftpClient = new FTPClient(); 

    try { 
     ftpClient.connect(host); 
     String pathToFiles = "/path/to/File"; 
     String ftpFileName = ""; 
     List<String> ftpFileNames = null; 
     InputStream iStream; 
     if(ftpClient.login(username, password)){ 
      ftpClient.enterLocalPassiveMode(); 
      FTPFile[] ftpFiles = ftpClient.listFiles(); 
      ftpFileNames = new ArrayList<String>(); 
      for (FTPFile ftpFile : ftpFiles) { 
       ftpFileName = ftpFile.getName(); 
       if(ftpFileName.contains(strDate)){ 
        iStream = ftpClient.retrieveFileStream(pathToFiles + ftpFileName); 
        System.out.println(ftpClient.getReplyString()); 

        InputStreamReader isr = new InputStreamReader(iStream); //Error on this line on second iteration 
        BufferedReader br = new BufferedReader(isr); 

        String line = ""; 

        while ((line = br.readLine()) != null) { 
         System.out.println(line); 
        } 

       } 
      } 
     } 

Répondre

0

cernées la question après beaucoup de débogage. Je n'appelais pas la fonction completePendingCommand() après avoir transféré le fichier pour vérifier l'état du transfert.

L'API pour FTPClient.retrieveFileStream() indique que pour finaliser le transfert de fichier, vous devez appeler FTPClient.completePendingCommand() et vérifier sa valeur de retour pour vérifier la réussite. Après avoir corrigé ce problème, tout a commencé à fonctionner correctement.

Questions connexes