1

Pair整数で使用するためのジェネリック クラスを作成しています。

例外クラス:

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

メインクラス:

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;
    }
}

テストケース

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());
}

このコードを実行すると、InputMismatchException. 例外を正しく作成しなかったか、スローされたときにそれをキャッチできませんでしたか?

4

6 に答える 6

1

私が何かを見逃していない限り、あなたはWrongThing例外ではなく例外をキャッチしようとしているだけのようですInputMismatchEception.

try{
    // ...
}catch(WrongThing exception){
    // ...
}
于 2012-10-25T06:44:50.837 に答える
1

WrongThing はカスタム例外です。必要に応じて、投げてキャッチする必要があります。

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

InputMismatchExceptionsc.nextInt()メソッドからスローされif the next token does not match the Integer regular expression, or is out of rangeます。したがって、それもキャッシュする必要があります。

于 2012-10-25T06:49:36.723 に答える
0

のドキュメントは次のようにjava.util.InputMismatchException述べています。

Scanner取得されたトークンが期待されるタイプのパターンと一致しないこと、またはトークンが期待されるタイプの範囲外であることを示すためにaによってスローされます。

のためのものはScanner.nextInt()言う:

スロー: -次のトークンが正規表現とInputMismatchException一致しない場合、または範囲外の場合Integer

基本的に、例外はScanner.nextInt()、整数ではないものをコンソールに入力したときにスローされます。その場合、コンストラクターnew Pair<Integer>(...)は呼び出されないため、コンストラクターにチェックを入れても意味がありません。

あなたがする必要があるのは

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");              
    }
}
于 2012-10-25T07:11:33.490 に答える
0

ペアクラスのオブジェクトを作成する場合

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

クラスでこのタイプの例外について言及したため、カスタム例外のみをスローできます。sc.nextInt()は、コンソールからの入力の整数型を想定し、他の文字が渡されると をスローしInputMismatchExceptionます。したがって、次のような InputMismatch Exception もキャッチする必要があります

try{
    // throw new WrongThing("wrong thing");
}catch(WrongThing e1){
    // ...
}catch(InputMismatchException e2){
    // ...
}
于 2012-10-25T07:19:07.167 に答える
0

スキャナは、処理していない InputMismatchException をスローしています。InputMismatchExceptionは RuntimeException なので、明示的にキャッチする必要はありません。(通常、これらはプログラマーのエラーです) Java 7 を使用している場合は、この構文 ( multicatch ) を使用して複数の例外を処理できます。

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

これは、両方の例外を同じ方法で処理することを前提としています。そうでない場合は、他の回答が明確にするために行ったように、それらを分割することをお勧めします。

于 2012-10-25T07:48:38.973 に答える
0

Scanner クラスの場合、プロセス hasNext() -> next() に従う必要があります

この方法で例外が発生することはありません。

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

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

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

もう1つのことは、catch(Exception e)すべての例外を確実にキャッチするために、下部にある例外ブロックのカスケードを持つことです。

   try{
         // code which throws checked exceptions.
        }catch(WrongThing e1){      
            e1.printStackTrace();
        }catch(Exception e2){
            e2.printStackTrace();
        }finally{
           // cleanup
       }
于 2012-10-25T07:03:03.100 に答える