2017-10-07 7 views
0

Salut J'ai des problèmes avec la méthode du scanner hasNextDouble(). Mon code lit à partir d'un fichier et crée un objet Vehicle, à ajouter à un tableau. La classe de véhicule a une sous-classe appelée OversizedVehicle, avec un champ supplémentaire double pour indiquer sa hauteur. C'est pourquoi j'utilise le if (hasNextDouble()) donc si le scanner lit un double il créerait un objet OversizedVehicle au lieu de Vehicle. Voici mon code:hasnextdouble pas lu mon prochain double dans un fichier

while(s1.hasNext()) 
    { 
      regNo = s1.next(); 
      make = s1.next(); 
      year = Integer.parseInt(s1.next()); 
      description = s1.next(); 
      if(s1.hasNextDouble() == true) { 
      height = s1.nextDouble(); 
      vehicle = new OversizedVehicle(regNo,make,year,description,height); 
      } 
      else { 
      vehicle = new Vehicle(regNo, make, year, description); 
      } 
      System.out.println("New vehicles from file added to array in position " + count); 
      vehicles[count] = vehicle; 
      count++; 
    } 

J'utilise l'IDE Eclipse et quand je lance ce en mode débogage l'instruction if évalue toujours true, en mettant correctement la prochaine regNo dans l'entrée dans la variable height. Même si dans l'entrée cette valeur n'est pas un double, mais un int. Je ne suis pas sûr de ce qui ne va pas.

+2

À quoi ressemble votre fichier d'entrée? – unjankify

+1

Veuillez mettre en majuscule et ponctuer et parser ce désordre inintelligible, et définir 'hasNextDouble() 'ne pas lire mon double suivant.' Qu'est-ce qui se passe à la – EJP

Répondre

0

Il me semble que votre entrée contient des paramètres de véhicules et véhicules surdimensionnés, où leur nombre de paramètres sont différents: les véhicules ont 4 paramètres, les véhicules surdimensionnés ont 5, quelque chose comme ceci:

1 Toyota 2015 sedan 2 Toyota 2016 truck 2.1 3 Toyota 2015 mini ... 

Et ainsi de suite. Je devine cela parce que vous semblez dire que s1.hasNextDouble() est toujours vrai, et il provoque "la variable regNo à initialiser en un double". Cela peut arriver par exemple lorsque le scanner a lu "sedan" dans l'exemple ci-dessus, le jeton suivant est "2", et que "2" peut être un double valide, s1.hasNextDouble() renvoie vrai. En d'autres termes, s1.hasNextDouble() sera vrai lorsque le jeton suivant est un double ou un entier.

Vous pouvez distinguer ces cas en vérifiant s1.hasNextInt(), parce que cela va revenir false pour un double et true pour un int.

while (scanner.hasNext()) { 
    String regNo = scanner.next(); 
    String make = scanner.next(); 
    int year = scanner.nextInt(); 
    String description = scanner.next(); 

    if (scanner.hasNext() && !scanner.hasNextInt()) { 
    double height = scanner.nextDouble(); 
    vehicle = new OversizedVehicle(regNo, make, year, description, height); 
    } else { 
    vehicle = new Vehicle(regNo, make, year, description); 
    } 

    // ... 
} 

Ceci devrait fonctionner pour l'exemple ci-dessus. Mais si vos données sont ligne par ligne, alors je recommanderais de compter sur le séparateur de ligne pour distinguer les enregistrements, cela rendra l'implémentation un peu plus simple et plus claire.

while (scanner.hasNext()) { 
    String line = scanner.nextLine(); 
    String[] parts = line.split(" "); 
    String regNo = parts[0]; 
    String make = parts[1]; 
    int year = Integer.parseInt(parts[2]); 
    String description = parts[3]; 

    if (parts.length == 5) { 
    double height = scanner.nextDouble(); 
    vehicle = new OversizedVehicle(regNo, make, year, description, height); 
    } else { 
    vehicle = new Vehicle(regNo, make, year, description); 
    } 

    // ... 
} 
+0

wow merci beaucoup! Je n'y ai pas pensé. :) :) – alexW