1

私は、例外のキャッチ処理の概念全体に少し慣れてthrows ArithmeticExceptionいないので、なぜ終了時に例外エラー メッセージ (この場合はゼロ) が生成されず、代わりにコンパイル中に生成されるのか疑問に思っていました。

正常にコンパイルして、画面にエラー メッセージを表示するべきではありませんか? 私は何を間違っていますか?

public class Exception_Tester 
{ 
    public static void main(String args[]) 
    { 
         Exception_Tester et = new Exception_Tester(); 
         int x1; 
         int x2; 
         x1 = 5; 
         x2 = 0; 
         et.printResults(x1, x2); 
    } 

    void printResults(int a, int b) throws ArithmeticException 
    { 
         System.out.println("Add: "+(a+b)); 
         System.out.println("Sub: "+(a-b)); 
         System.out.println("Mul: "+(a*b));
         System.out.println("Div: "+(a/b));
    }  
} 
4

3 に答える 3

0

次の図を見てください。

例外カテゴリ

ご覧のとおり、いくつかの例外クラスは、注意を引くために太字で表示されています。これらのカテゴリの例外に関する編集者の説明は次のとおりです。

  • 正しいプログラムですぐに発生する可能性がある条件は、チェック例外です。具体的には、この種の例外はコンパイラによって <> 発生し、コンパイラはそれらの発生の不測の事態を正しく評価し、状況がそれに対応する場合にコンパイル エラーを宣言できます。図からわかるように、NullPointerException はこのカテゴリの直下にはありません。これらは、Exception クラスを直接拡張する例外です。

  • 通常は致命的と見なされる重大な問題、またはプログラムのバグを反映していると思われる状況は、未チェックの例外です。

  • 致命的な状況は、Error クラスによって表されます。

  • 考えられるバグは、RuntimeException クラスによって表されます。これは、RuntimeException クラスを拡張する例外の例です。NullPointerException はその 1 つです。この種の例外のほとんどの場合、アプリケーションの動的な状態に強く依存しているため、コンパイラは @compile 時間を評価して例外を発生させることができません。

簡単な図を次に示します。

Exception を拡張する 2 つの例外クラスを作成しました。

public class Exception1 extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

}

そしてRuntimeExceptionを拡張するもの

public class Exception2 extends RuntimeException {

    private static final long serialVersionUID = 4595191052237661216L;

}

次に、次の NewTester クラスがあります

public class NewTester {

    public static void methodA() throws Exception1 {

        throw new Exception1();
    }

    public static void methodB() throws Exception2 {

        throw new Exception2();
    }

    public static void main(String[] args) {
        // methodA();
        methodB();
    }
}

methodA の呼び出しに意図的にコメントを付けました。この状態では、呼び出されたメソッドが uncheckedである RuntimeException をスローするため、methodBコンパイル エラーは発生しません。しかし、methodA の呼び出しをコメント解除し、methodB の呼び出しをコメント化してこのコードを変更すると、methodA がチェック例外をスローするため、コンパイル エラーが発生します。

これが役立つことを願っています

于 2015-04-17T19:05:04.377 に答える
0

Checked Exception: これらの例外を処理していない場合、これらの例外はコンパイル中にエラーをスローします。 Unchecked Exception: 未処理の場合、RunTime でのみエラーが発生します。

ArithmaticException非チェック例外であるため、実行時に例外が発生します。

try-catch ブロックを使用している場合は、使用する必要があります

printStackTrace()

例外スタック トレースを出力するメソッド。

なので :

try{
    System.out.println("Add: "+(a+b)); 
    System.out.println("Sub: "+(a-b)); 
    System.out.println("Mul: "+(a*b));
     System.out.println("Div: "+(a/b));
}
catch(ArithmeticException e){
    e.printStackTrace();
}
于 2015-04-17T18:50:22.250 に答える
0

あなたのコードをそのまま実行しました

public class Exception_Tester 
{ 
public static void main(String args[]) 
{ 
 Exception_Tester et = new Exception_Tester(); 
 int x1; 
 int x2; 
 x1 = 5; 
 x2 = 0; 
 et.printResults(x1, x2); 
} 
void printResults(int a, int b) throws ArithmeticException 
{ 
  System.out.println("Add: "+(a+b)); 
  System.out.println("Sub: "+(a-b)); 
  System.out.println("Mul: "+(a*b));
  System.out.println("Div: "+(a/b));
}  
} 

そして、エラーや例外なしで正常にコンパイルされ、要件に従って、実行時にSystem.out.println("Div: "+(a/b));ステートメントが検出された場合にのみ ArithmeticException がスローされます。

だから私はそこに何の問題も見ません!

于 2015-04-17T19:29:19.120 に答える