2010-04-11 7 views
0
$ javac ArrayListTest.java 
$ java ArrayListTest 
$ cat ArrayListTest.java 
import java.io.*; 
import java.util.*; 

public class ArrayListTest{ 

    public static void main(String[] args) { 
     try { 
      String hello ="oeoaseu oeu hsoae sthoaust hoaeut hoasntu"; 
      ArrayList<String> appendMe = null; 

      for(String s : hello.split(" ")) 
       appendMe.add(s+" "); 

      for(String s : appendMe) 
       System.out.println(s); 
      //WHY DOES IT NOT PRINT? 
     }catch(Exception e){ 
     } 
    } 
} 

Répondre

4

Vous devez initialiser appendMe.

appendMe = new ArrayList<String>(); 
7

Lorsque vous essayez d'appeler appendMe.add() un NullPointerException est jeté, que vous définissez explicitement null, donc l'exécution saute directement au bloc catch et que la deuxième boucle est même pas en cours d'exécution. Toutefois, vous capturez silencieusement toutes les exceptions, l'erreur n'est donc pas affichée. Vous ne devriez probablement pas avoir ce try/catch global ici; à tout le moins, ajoutez un e.printStackTrace(); au bloc catch pour que les exceptions ne soient pas simplement ignorées silencieusement

+0

+1 - Aucun bloc catch try vide - plus de douleur à long terme que juste prendre l'habitude de « lancer » dans quelque chose comme e.printStackTrace(). –

3

L'écriture de blocs vides catch est une très mauvaise pratique. Ne prenez pas l'habitude de le faire. Bien que suihock capturé la cause racine de votre problème, si vous aviez imprimé l'exception dans le bloc catch:

} catch (Exception e) { 
    System.out.println("Got an exception: " + e.getMessage()); 
} 

... vous auriez immédiatement trouvé la cause de votre problème.

5

D'abord, vous joignons votre code dans un bloc try/catch mais vous êtes avaler l'exception qui est une pratique très BAD. Ne faites pas cela, c'est en fait la raison pour laquelle vous n'obtenez aucun message utile ici. Donc, soit se connecter l'exception ou d'imprimer e.printStackTrace dans le bloc catch ou simplement supprimer le try/catch, il n'y a pas tout Exception à attraper. Deuxièmement, vous devriez programmer des interfaces, pas des classes concrètes (de cette façon, vous pouvez changer l'implémentation concrète sans modifier le code entier). Ainsi, au lieu de:

ArrayList<String> appendMe; 

déclare:

List<String> appendMe; 

Troisièmement, vous devez initialiser appendMe quelque part (ce qui est la cause du dysfonctionnement et provoque plus tard NullPointerException), par exemple lors de la déclaration :

List<String> appendMe = new ArrayList<String>(); 

Enfin, je recommande d'utiliser des crochets dans vos boucles, même s'il n'y a qu'une seule ligne.

Pour résumer:

import java.io.*; 
import java.util.*; 

public class ArrayListTest{ 

    public static void main(String[] args) { 
     String hello ="oeoaseu oeu hsoae sthoaust hoaeut hoasntu"; 
     List<String> appendMe = new ArrayList<String>(); 

     for(String s : hello.split(" ")) { 
      appendMe.add(s+" "); 
     } 

     for(String s : appendMe) { 
      System.out.println(s); 
     } 
    } 
} 
+0

ne peut pas comprendre l'interface. Vous voulez dire qu'il est préférable d'utiliser la liste car elle est plus générale et peut donc être plus facilement adaptée aux changements? – hhh

+0

@HH Kinda. L'avantage peut ne pas être évident avec votre code mais cette page devrait rendre les choses plus claires http://mindprod.com/jgloss/interface.html#MAINTENANCE. –