2011-09-09 3 views
0
public int Remove(int i, Briefcase c[], String[] m) { 

     int nChoice = 0; 
     boolean inputisok = false; 

     while (inputisok == false) { 
      System.out.print("\tPlease remove " + i + " cases: "); 
      nChoice = input.nextInt(); 
      if (c[nChoice] == null || nChoice < 0 && nChoice >= c.length) { 
       System.out.println(); 
       System.out.println("\tInvalid Input please Try again\n"); 
      } else { 
       System.out.println("\tI'm " + m[nChoice] 
         + " You just removed case # " + nChoice); 
       System.out.println("\t|" + nChoice + "| contains $" 
         + c[nChoice].getAmount() + "\n"); 
       inputisok = true; 
      } 
     } 
     return nChoice; 
    } 

mon problème est que lorsque j'entre une lettre et un numéro séronégatifs, ou un nombre qui est supérieur à 27, je reçois toujours une erreur d'exception, comment puis-je résoudre ce problème?Aide avec les entrées en utilisant le scanner

Répondre

0

La ligne suivante est incorrecte:

if (c[nChoice] == null || nChoice < 0 && nChoice >= c.length) { 

Vous voulez changer comme ceci:

if (nChoice < 0 || nChoice >= c.length || c[nChoice] == null) { 

Il y a deux changements: (1) le && est devenu un ||; (2) les clauses ont été réorganisées.

(1) Le && est faux que nChoice < 0 && nChoice >= c.length évalue toujours false, puisque nChoice ne peut pas être en même temps inférieur à zéro et supérieur à c.length (Merci, @Aleks G!)

(2) Dans l'original version vous essayez d'accéder c[nChoice] avant de vous assurer que nChoice est dans les limites de c. Si ce n'est pas le cas, cela entraînera un ArrayIndexOutOfBoundsException au lieu d'afficher "Invalid Input".

Short-circuit evaluation est la raison pour laquelle l'ordre des clauses est important.

Enfin, avant de lire input, vous pouvez appeler hasNextInt() pour vous assurer que le jeton suivant peut être interprété comme un entier valide.

+0

Je ne pense pas que la première partie puisse être vraie: 'c.length' sera toujours supérieur ou égal à 0; par conséquent, la première partie de cette instruction 'if' signifie essentiellement' if (cChoice <0 && cChoice> = 0) '- ce sera toujours' false'. Je pense que ce dont il a probablement besoin est 'if (nChoice <0 || nChoice> = c.length || c [nChoice] == nul)' –

+0

@Aleks G: Bonne prise! Éditera la réponse. Merci. – NPE

+0

quelles sont les autres erreurs? ou des torts? –

0

Utilisez la méthode hasNextInt():

public int Remove(int i, Briefcase c[], String[] m) { 

    boolean isNextIntCorrect = false; 
    int enteredInt; 

    while(!isNextIntCorrect){ 
     System.out.println("\tPlease remove " + i + " cases: "); 
     Scanner inputScanner = new Scanner(input.next()); 
     if(inputScanner.hasNextInt()){ 
      enteredInt = inputScanner.nextInt(); 
      isNextIntCorrect = enteredInt >= 0 && enteredInt < c.length 
       && enteredInt < m.length) 
     } 
     inputScanner.close(); 

     if(!isNextIntCorrect){ 
      System.out.println("\tInvalid Input please Try again\n"); 
     } 
    } 
    System.out.println("\tI'm " + m[enteredInt] 
        + " You just removed case # " + enteredInt); 
    System.out.println("\t|" + enteredInt+ "| contains $" 
        + c[enteredInt].getAmount() + "\n"); 
} 

De cette façon, vous êtes sûr de traiter avec un correct int!

Questions connexes