web-dev-qa-db-fra.com

Aucune telle exception d'élément?

Alors voici mon code:

public static void getArmor(String treasure)
    throws FileNotFoundException{
    Random Rand=new Random();
    Scanner file=new Scanner(new File ("armor.txt"));
    while(!file.next().equals(treasure)){
        file.next(); //stack trace error here
        }
    int min=file.nextInt();
    int max=file.nextInt();
    int defense=min + (int)(Math.random() * ((max - min) + 1));
    treasure=treasure.replace("_", " ");
    System.out.println(treasure);
    System.out.println("Defense: "+defense);
    System.out.println("=====");
    System.out.println();
    }

public static void getTreasureClass(Monster monGet)
throws FileNotFoundException{
    Random Rand = new Random();
    String tc=monGet.getTreasureClass();
    while (tc.startsWith("tc:")){
        Scanner scan=new Scanner(new File ("TreasureClassEx.txt"));
        String eachLine=scan.nextLine();
        while(!tc.equals(scan.next())){
        eachLine=scan.nextLine();
        }
        for (int i=0;i<=Rand.nextInt(3);i++){
            tc=scan.next();
        }
    getArmor(tc); //stack trace error here
    }
 }

Pour une raison quelconque, je n’obtiens pas d’exception de ce type.

    at Java.util.Scanner.throwFor(Scanner.Java:907)
at Java.util.Scanner.next(Scanner.Java:1416)
at LootGenerator.getArmor(LootGenerator.Java:43)
at LootGenerator.getTreasureClass(LootGenerator.Java:68)
at LootGenerator.getMonster(LootGenerator.Java:127)
at LootGenerator.theGame(LootGenerator.Java:19)
at LootGenerator.main(LootGenerator.Java:11)

Je ne sais pas pourquoi cependant. Fondamentalement, mon programme effectue une recherche dans deux fichiers texte - armor.txt et TreasureClassEx.txt. getTreasureClass reçoit une classe de trésor d'un monstre et cherche dans le texte jusqu'à ce qu'il atteigne un élément d'armure de base (une chaîne qui ne commence pas par tc :.) Il cherche ensuite dans getArmor une armure qui correspond au nom de l'armure de base qu'il a reçue classe au trésor. Tout avis sera le bienvenu! Merci!

Le lien vers les fichiers txt est ici: http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.Zip

11
Akaraka

Il semble que vous appeliez ensuite même si le scanneur n'a plus d'élément suivant à fournir: le lancement de l'exception.

while(!file.next().equals(treasure)){
        file.next();
        }

Devrait être quelque chose comme

boolean foundTreasure = false;

while(file.hasNext()){
     if(file.next().equals(treasure)){
          foundTreasure = true;
          break; // found treasure, if you need to use it, assign to variable beforehand
     }
}
    // out here, either we never found treasure at all, or the last element we looked as was treasure... act accordingly
15
Bryan

Je sais que cette question a été posée il y a 3 ans, mais je viens d'avoir le même problème, et ce qui l'a résolu au lieu de mettre:

 while (i.hasNext()) {
    // code goes here 
}

J'ai fait une itération au début, puis vérifié la condition en utilisant: 

do {
   // code goes here
} while (i.hasNext());

J'espère que cela aidera certaines personnes à un moment donné.

0
Yakuman

On dirait que votre ligne file.next () dans la boucle while renvoie l'exception NoSuchElementException puisque l'analyseur a atteint la fin du fichier. Lire la prochaine () API Java ici

Aussi, vous ne devriez pas appeler next () dans la boucle et aussi dans la condition while. Dans la condition while, vous devriez vérifier si le jeton suivant est disponible et à l'intérieur de la boucle while, vérifier si elle est égale à un trésor.

0
Aditya Naidu

J'avais rencontré le même problème alors que je traitais de grands ensembles de données. Une chose que j'ai remarquée est que la NoSuchElementException est lancée lorsque le scanner atteint la endOfFile, où cela n'affectera pas nos données. 

Ici, j'ai placé mon code dans try block et catch block gère la variable exception. Vous pouvez également le laisser vide si vous ne souhaitez effectuer aucune tâche. 

Pour la question ci-dessus, étant donné que vous utilisez file.next() à la fois dans la condition et dans la boucle while, vous pouvez gérer l’exception de la manière suivante: 

while(!file.next().equals(treasure)){
    try{
        file.next(); //stack trace error here
       }catch(NoSuchElementException e) {  }
}

Cela a parfaitement fonctionné pour moi. S'il existe des cas critiques pour mon approche, faites-le-moi savoir à travers des commentaires. 

0
Giri