2014-07-19 3 views
2

Obtention de NullPointerException lorsqu 'il tente d'accéder aux pierres [0] .length. S'il vous plaît, aidez. J'ai déjà Initialized Stones Object.exception de pointeur nul en Java.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.*; 
public class Solution 
    { 
public static void main(String args[]) throws IOException 
    { 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    Scanner sc = new Scanner(System.in); 
    int times = sc.nextInt(); 

    String stones[] = new String[times]; 
    int score = 0; 
     int counter; 

    for(int tcase = 0; tcase < times; tcase++) 
     stones[tcase] = br.readLine(); 

     int s = stones[0].length(); 
     for (int i = 0; i < s ; i++) { 
      char j = stones[0].charAt(i); 
      counter = 0; 
      for (int k = 1; k < times; k++) { 
       char aa[] = stones[k].toCharArray(); 
       for (int l = 0; l <aa.length ; l++) { 
        if(aa[l]==j) 
        { 
         counter++; 
         break; 

        } 
       } 
       if (counter==times-1) { 
        score++; 
       } 
      } 
     } 

    System.out.println(score); 
    } 
    } 

Obtenir NullPointerException lorsque je tente d'accéder à des pierres [0] .length(). Aidez-nous

+2

duplication possible de [Qu'est-ce qu'une exception pointeur nul, et comment puis-je résoudre ce problème?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – DavidPostill

+5

Bizarre, j'ai copié ton code, lance-le et je ne reçois aucune exception. Quelle est votre contribution? – libik

+0

c'est en fait un programme de HackerRank. Cela fonctionne correctement quand je le lance dans mon ordinateur portable. Le problème se pose lorsque j'essaie de le soumettre. – Ishada

Répondre

2

Lorsque vous soumettez votre code via un service automatisé, il exécute votre code et il échoue car il n'y a pas de flux System.in pour fournir des données valides. Si vous essayez de vérifier des données valides avant de faire quoi que ce soit, il va attraper cette condition, et devrait vous permettre de soumettre, tout en travaillant correctement sur votre ordinateur portable.

Essayez ceci:

Scanner sc = new Scanner(System.in); 
int times = 0; 

if (sc.hasNext()) { // check to make sure there's valid input first 
    times = sc.nextInt(); 


    String stones[] = new String[times]; 
    int score = 0; 
     int counter; 

    for(int tcase = 0; tcase < times; tcase++) 
     stones[tcase] = br.readLine(); 

    if (stones[0] != null) { // check to make sure your array object exists 
     int s = stones[0].length(); 
     for (int i = 0; i < s ; i++) { 
      char j = stones[0].charAt(i); 
      counter = 0; 
      for (int k = 1; k < times; k++) { 
       char aa[] = stones[k].toCharArray(); 
       for (int l = 0; l <aa.length ; l++) { 
        if(aa[l]==j) 
        { 
         counter++; 
         break; 
        } 
       } 
       if (counter==times-1) { 
        score++; 
       } 
      } 
     } 
    } 
} 
+0

ne fonctionne pas. J'ai essayé . même erreur encore @ryan – Ishada

+0

Ensuite, vous ajoutez également une vérification pour vous assurer que le contenu de votre tableau est valide. –

+0

Merci @Ryan. Je l'ai. – Ishada

0

Il travaille avec moi, bien que je ne voudrais pas utiliser deux lecteurs de flux (un scanner et un BufferedReader) pour la même entrée.

Quelle est l'entrée qui provoque l'exception?

PS. Vous devriez fermer le scanner lorsqu'il n'est pas utilisé.

1

La meilleure façon de comprendre ce genre de problèmes est d'utiliser un débogueur. Mais juste pour le plaisir, nous allons faire une analyse de code ...

int s = stones[0].length(); 

Que peut-on génère une NullPointerException sur cette ligne? Eh bien, la variable stones pourrait faire référence à null. Nous pouvons cependant l'exclure facilement car la variable stones a été affectée à une nouvelle instance de tableau plus haut dans le code, et n'a jamais été réattribuée avant d'avoir atteint la ligne de problème. La seule autre possibilité est que la variable de composant de tableau stones[0] fait référence à null.

Pourquoi est-ce que stones[0] peut être nul? Eh bien, pour les débutants, il est initialisé de cette façon, donc si vous n'attribuez jamais à ce composant, alors il sera nul. Toutefois, la boucle for que vous avez entre l'initialisation du tableau et la ligne de problème parcourt tous les composants de la baie et les initialise, de sorte que chaque composant est affecté. Quoi d'autre pourrait être le problème?

La boucle affecte à chaque composant du tableau la valeur renvoyée par br.readLine(). Cette valeur de retour peut-elle être null? Jetons un coup d'oeil à la javadocs ... En effet, nous trouvons (nous soulignons):

Retours: une chaîne contenant le contenu de la ligne, sans compter les caractères de fin de lignes, ou null si la fin du cours d'eau a été atteint

Et là vous l'avez, il est certainement possible pour stones[0] comme nul! Maintenant, si cela est vrai, qu'est-ce que cela signifie? Eh bien, cela signifie que le tout premier appel à br.readLine() a retourné null, signalant qu'il avait atteint la fin du flux. Ce qui correspond à ce que d'autres répondeurs ont noté - si System.in() n'est pas disponible pour fournir des données, il serait logique de rencontrer la condition «fin de flux» dès la sortie de la porte.

+0

Merci @Kevin pour une explication claire. – Ishada