2012-10-25 2 views
1

Je crée une classe générique Pair destinée aux entiers.Besoin d'aide pour attraper une exception

Exception Classe:

public class WrongThing extends Exception{ 
    public WrongThing(String message) { 
     super(message); 
    } 
} 

Classe principale:

public class Pair<E> implements Comparable<E>{ 
    private E var1; 
    private E var2; 
    public Pair(E var1, E var2) throws WrongThing{ 
     //this is on purpose!!! 
     System.out.println("var1 and var2 are switched"); 
     this.var1 = var2; 
     this.var2 = var1; 
    } 

    void get(){ 
     System.out.println("the first actualy 2nd: "+ 
       var1 + "the "); 
       System.out.println(" second actualy first" + var2); 
    } 

    void set1(E temp){ 
     System.out.println("var1 and var2 are switched"); 
     temp = var1; 
    } 

    void set2(E temp){ 
     System.out.println("var1 and var2 are switched"); 
     temp = var2; 
    } 

    E smallest(E var1, E var2){ 

     return var1; 
    } 

    @Override 
    public int compareTo(Object arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

test cas

import java.util.Scanner; 
import java.util.InputMismatchException; 

public class PairTest { 
    public static void main(String[] args) throws WrongThing{ 
     System.out.println("two integers please"); 
     Scanner sc = new Scanner(System.in); 
     Pair<Integer> newPair; 
     Pair<Integer> tempPair1= new Pair<Integer>(3,2); 

     try{ 
      newPair = new Pair<Integer>(sc.nextInt(),sc.nextInt()); 
      //throw new InputMismatchException("that is not an Integer...."); 
     }catch(WrongThing exception){ 
      //System.out.println("you cant do that. try again and press enter after the first integer"); 
      newPair = new Pair<Integer>(sc.nextInt(),sc.nextInt()); 
      newPair.get(); 

     } 
     finally{ 


     } 
    } 
    //newPair = new Pair<Integer>(sc.nextInt(),sc.nextInt()); 
} 

Quand je lance ce code je reçois un InputMismatchException. N'ai-je pas créé mon exception correctement ou ne l'ai pas attrapé quand il a été lancé?

+0

J'ai supprimé la balise Eclipse, car ce problème n'est pas lié à l'IDE que vous utilisez: c'est un problème Java "pur". –

Répondre

1

Sauf si quelque chose me manque, il semble que vous essayez seulement d'attraper une exception WrongThing, pas une InputMismatchEception.

try{ 
    // ... 
}catch(WrongThing exception){ 
    // ... 
} 
1

WrongThing est votre exception personnalisée. Si nécessaire, vous devez le jeter et l'attraper.

try{ 
    // throw new WrongThing("wrong thing"); 
}catch(WrongThing e1){ 
    // ... 
}catch(InputMismatchException e2){ 
    // ... 
} 

InputMismatchException est jeté de sc.nextInt() méthode if the next token does not match the Integer regular expression, or is out of range. Donc, vous devez le mettre en cache aussi.

0

Pour la classe Scanner vous devez suivre le processus hasNext() -> next()

Vous obtiendrez pas une exception de cette façon.

Scanner sc = new Scanner(System.in);  
      while (sc.hasNext()) { 

       if(sc.hasNextInt()) 
       System.out.println(sc.nextInt()); 

       sc.next(); 
      } 
     sc.close(); 

Une autre chose est d'avoir une cascade de blocs d'exception avec catch(Exception e) au fond pour être sûr d'attraper toutes les exceptions.

try{ 
     // code which throws checked exceptions. 
     }catch(WrongThing e1){  
      e1.printStackTrace(); 
     }catch(Exception e2){ 
      e2.printStackTrace(); 
     }finally{ 
      // cleanup 
     } 
0

La documentation java.util.InputMismatchException dit:

Jeté par un Scanner pour indiquer que le jeton récupéré ne correspond pas au modèle du type prévu, ou que le jeton est hors de portée pour les attendus type.

L'un pour Scanner.nextInt() dit:

Lancers: InputMismatchException - si le prochain jeton ne correspond pas à l'expression régulière Integer, ou est hors de portée

Fondamentalement, l'exception est jeté de Scanner.nextInt() lorsque vous tapez quelque chose dans la console qui n'est pas un nombre entier. Lorsque cela se produit, le constructeur new Pair<Integer>(...) ne sera même pas appelé, donc toute vérification que vous mettez dans le constructeur devient inutile.

Ce que vous devez faire est

newPair = null; 
while (newPair == null) { 
    try { 
     newPair = new Pair<Integer>(sc.nextInt(),sc.nextInt()); 
    } catch(InputMismatchException exception){ 
     System.out.println("you cant do that. try again and press enter after the first");    
    } 
} 
0

Lorsque vous créez objet de paire classe

Pair newPair = new Pair<Integer>(sc.nextInt(),sc.nextInt()); 

Il ne peut jeter l'exception personnalisée que vous avez mentionné ce type d'exception dans votre classe. sc.nextInt() attend un type d'entrée Integer à partir de la console et lorsque tout autre caractère est passé, il renvoie InputMismatchException. Donc, vous devez également saisir l'exception InputMismatch comme

try{ 
    // throw new WrongThing("wrong thing"); 
}catch(WrongThing e1){ 
    // ... 
}catch(InputMismatchException e2){ 
    // ... 
} 
0

Le scanner lance InputMismatchException que vous ne gérez pas. InputMismatchException est une RuntimeException de sorte que vous n'avez pas besoin de l'attraper explicitement. (Généralement TESE sont des erreurs de programmeur) Si vous utilisez Java 7, vous pouvez utiliser cette syntaxe (multicatch) pour faire face à plus d'une exception

try{ 
.... 
} 
catch(WrongThing|InputMismatchException e1){ 
     //deal with exception. 
} 

Cela suppose que vous voulez faire affaire avec les deux exceptions dans la même façon. Si vous ne le faites pas alors je conseillerais de les diviser comme d'autres réponses l'ont fait pour plus de clarté.

Questions connexes