$ 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){
}
}
}
Java: problème d'initialisation, impossible d'imprimer les valeurs "affectées" à partir de arrayList
Répondre
Vous devez initialiser appendMe.
appendMe = new ArrayList<String>();
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
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.
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);
}
}
}
ne peut pas comprendre l'interface. Vous voulez dire qu'il est préférable d'utiliser la liste
@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. –
+1 - Aucun bloc catch try vide - plus de douleur à long terme que juste prendre l'habitude de « lancer » dans quelque chose comme e.printStackTrace(). –