2
votes

Aucune exception d'élément de ce type lors de l'analyse de plusieurs entrées

Je suis nouveau dans la programmation java, et j'essaie d'apprendre l'utilisation des classes et des objets dans la programmation java, tout en écrivant le code suivant, j'ai eu une exception

java.util.NoSuchElementException

pour un exemple d'entrée

5

1 2 3 4 5

ici la première ligne contient le nombre d'éléments (dans ce cas, ses 5 ), et la ligne suivante contient des éléments.

tout en prenant l'entrée dans la boucle for de la classe Election, j'obtiens une exception.

J'ai essayé de chercher sur stack Overflow, et d'autres ressources aussi , mais je n'arrive toujours pas à comprendre comment supprimer cette exception.

import java.io.*;
import java.util.Scanner;
public class TestClass {
     public static void main(String[] args) {
        int n;
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        input.nextLine();
        Election obj = new Election(n);
        obj.getVotes();
    }
}
class Election {
     int n,v1,v2,v3,v4,v5,d;
     public Election(int n) {
          this.n = n;
          v1=v2=v3=v4=v5=d=0;
     }
     public void getVotes() {
       Scanner sc = new Scanner(System.in);
       for(int i = 0 ; i < 1 ; i++) {
         int var = sc.nextInt();
         switch(var) {
             case 1: ++v1; break;
             case 2: ++v2; break;
             case 3: ++v3; break;
             case 4: ++v4; break;
             case 5: ++v5; break;
           default: ++d; break;
         }
       }     
     }
}


7 commentaires

Je ne peux pas reproduire votre problème avec le code que vous avez publié. Avez-vous publié le code tel que vous l'avez dans votre IDE? Fermez-vous vos Scanner quelque part (car vous ne devriez pas)? Quelques petites remarques (non liées): v1 = v2 = v3 = v4 = v5 = d = 0; est redondant car les champs int sont définis par défaut sur 0 . Et votre n n'est utilisé nulle part.


@ TiiJ7, dans la boucle for, la condition doit être (i


Comme je l'ai dit, vous ne devriez pas fermer les Scanner dans ce cas, car cela fermerait System.in . Il serait probablement préférable de réutiliser le même scanner, cependant. Quoi qu'il en soit, je peux reproduire votre problème dans ideone , mais pas dans Eclipse. Quel IDE utilisez-vous?


@AyushMishra J'ai publié une réponse tardive, mais vérifiez-la quand même. Cela peut vous aider à comprendre comment étendre la réutilisabilité et les fonctionnalités de votre programme. S'il y a quelque chose dans les changements qui n'est pas clair pour vous, faites-le moi savoir afin que je puisse améliorer ma solution


@AyushMishra Merci d'avoir accepté ma réponse comme solution préférée. S'il vous plaît, pensez à voter également :) Bravo.


@P. Soutzikevich, je ne peux pas voter pour parce que je suis nouveau dans le stack overflow, j'ai une réputation de moins de 15 ans, j'ai rejoint aujourd'hui


@AyushMishra Pas de soucis mon pote. Bienvenue dans le débordement de pile!


3 Réponses :


0
votes

J'ai essayé d'exécuter votre code dans une courte classe principale et je ne reçois aucune exception. Voici comment j'ai exécuté votre méthode:

2 // v1
3 // v2
1 // v3
1 // v4
1 // v5
2 // d

Mon entrée était 1 2 3 4 5 6 7 1 2 2 et la sortie de la console était:

public static  void main(String...args){
    Election election = new Election(10);
    election.getVotes();
    System.out.println(election.v1);
    System.out.println(election.v2);
    System.out.println(election.v3);
    System.out.println(election.v4);
    System.out.println(election.v5);
    System.out.println(election.d);
}

J'ai apporté une petite modification à votre programme. Dans la boucle for de la méthode getVotes () , j'ai changé la condition en i (au lieu de i dans votre code publié )


5 commentaires

J'ai tapé par erreur cette condition .. (i


Vous avez modifié votre message depuis que je l'ai collé dans mon IDE, je vais essayer de nouveau


@AyushMishra Je l'ai copié et collé à nouveau exactement dans mon IDE, et je ne reçois toujours aucune exception.


@FrenchFiagro, je ne sais pas pourquoi vous n'obtenez aucune exception, mais comme nous ne pouvons pas créer deux objets scanner en même temps en utilisant System.in, si j'ai besoin d'utiliser plusieurs objets Scanner, je devrais fermer le précédent sinon l'exception vient. ** stackoverflow.com/questions/4232588/... **


@AyushMishra Pourquoi auriez-vous besoin d'utiliser plusieurs objets de type Scanner () mon ami?



1
votes

Je pense que le code que vous avez publié est manquant. Le code que vous avez publié fonctionne correctement et j'ai réussi à obtenir une exception uniquement lorsque j'ai écrit input.close () avant obj.getVotes (). Lorsque vous souhaitez fermer les scanners, vous devez le faire une fois le code terminé. Ainsi, si vous fermez l'entrée après obj.getVotes (), vous ne devriez obtenir aucune erreur.


0 commentaires

1
votes

On dirait que je suis un peu en retard, mais comme votre réponse acceptée est plus un commentaire qu'une solution, je la publierai quand même.

Voici une simple déviation du code que vous avez fourni, mais atteint le résultat souhaité!

Je vais vous expliquer ceci:

public class Election {
    private final int VOTES_NUM = 1;
    private int v1,v2,v3,v4,v5,d;

    public Election() {
        v1=v2=v3=v4=v5=d=0;
        //print now, just to show that all variables = 0
        testResult();
    }

    //Simple method that prints value of each variable. We use this for testing
    public void testResult(){
        System.out.println("v1 = "+v1);
        System.out.println("v2 = "+v2);
        System.out.println("v3 = "+v3);
        System.out.println("v4 = "+v4);
        System.out.println("v5 = "+v5);
        System.out.println("d = "+d);
    }

    private int getInput(){
       //First of all, we need a Scanner to take user input. 
       //You do that in your own code too. We simply move it in this method instead.
        Scanner input = new Scanner(System.in);

        //You also need variable to hold the user input. 
        //(Always give meaningful names to all entities)
        int userInput;

        System.out.print("Please enter vote number here: ");

        //the next part has to be in a try-catch block, 
        //to avoid exceptions like InputMismatchException, etc..
        try{
            //Get user input
            userInput = input.nextInt();
        }
        //If user enters letter, or symbol, or something else that isn't an integer,
        //then inform them of the mistake they made and recursively call this method,
        //until they get it right!
        catch (InputMismatchException ime){
            System.out.println("Please enter only a single number");
            return getInput();
        }

        //If all goes well, return the user input
        return userInput;
    }

    public void getVotes() {
        //'VOTES_NUM' is a constant that defines the times the 
        //loop will iterate (like Macros in 'C')
        for(int x=0; x<VOTES_NUM; x++)
            int n = getInput();
        //then let the switch statement increment one of the variables
        switch(userInput) {
            case 1: ++v1; break;
            case 2: ++v2; break;
            case 3: ++v3; break;
            case 4: ++v4; break;
            case 5: ++v5; break;
            default: ++d; break;
        }
    }
}

Maintenant, jetons un œil à la classe Election et comment cela fonctionne.

public class MyTest {
    public static void main(String[] args) {

        //First of all, we need an instance of an Election-type object, so
        //that we can call its methods and get votes from users.
        Election e = new Election();
        //Now we can easily call the method getVotes(), as defined in Election class.
        //What happens here, is that the program will 'jump' to the getVotes() method
        //and it will execute every line of code in that method. Then it will
        //'return' to where it 'left off' in the main() method. Since getVotes()
        //is of type 'void', it will not return anything. It will just 'jump' back.
        e.getVotes();

        //Now, you can use testResult() method, to see the values of the variables.
        e.testResult();
    }
}


0 commentaires