3

Java初心者ですのでよろしくお願いします

static int load = 100;
static int greet;

public void loadDeduct(int cLoad, int c){
    int balance;
    balance = cLoad - 7;
    System.out.println("Your balance: " + balance);
}

public void loadDeduct(int tLoad){
    int balance;
    balance = tLoad - 1;
    System.out.println("Your balance is: " + balance);
}

public static void main (String [] args){
    int choice;
    Scanner scan = new Scanner(System.in);

    System.out.println("I'm a cellphone, what do you want to do?");
    System.out.println("Press 1 to send SMS / Press 2 to Call");

    choice = scan.nextInt();

    CellphoneLoad N95 = new CellphoneLoad();

    if (choice == 1){
        N95.loadDeduct(load);
    }else if (choice == 2){
        N95.loadDeduct(load, greet);
    }else{
        System.out.println("Invalid Option!!!");
    }

このプログラムで例外処理を実装するにはどうすればよいですか? 例外全体についてまだ教えられていないため、catch ブロックの使用方法がよくわかりません。それは私たちが行うように求められた単なる演習でした. if else ステートメントを try-catch ブロックに置き換えたいのですが、それは可能ですか?

4

7 に答える 7

2

Java の例外について考慮すべき重要な原則の 1 つは、次の 2 つのタイプがあるということです。

プログラミング エラーが発生した場合、実行時例外をスローする必要があります。一般に、エラーを報告するためにトップ レベルでキャッチしない限り、例外はキャッチされません。

型指定された/明示的な例外はメソッド呼び出しで装飾され、呼び出し元がそれらに対して何らかのアクションを実行できるようにする必要があります。

上記のコードの場合、例外処理を使用する必要があると思われる場所は実際にはありません。

また、Patrick が指摘したように、通常はフロー制御に例外を使用することは望ましくありません。

于 2009-05-08T04:17:37.127 に答える
1

フロー制御に例外を使用することは理想的ではありません。あなたのコードから、どの例外がスローされる可能性があるかは明確ではありません。たぶん、もう少し詳しく説明できます。

于 2009-05-08T04:02:56.490 に答える
1

例外をスローする可能性があるコードの唯一の部分は、次の呼び出しです。

scan.nextInt();

JavaDocs によると、これにより次の例外がスローされる可能性があります。

  • InputMismatchException (次のトークンが Integer 正規表現と一致しない場合、または範囲外の場合)
  • NoSuchElementException (入力が使い果たされた場合)
  • IllegalStateException (このスキャナーが閉じている場合)

したがって、コードでこれらの例外がスローされる可能性を考慮したい場合は、次のように書き直す必要があります。

try {
    choice = scan.nextInt();
} 
catch (InputMismatchException e) {
  System.out.println(e.getMessage());
}
catch (NoSuchElementException e) {
  System.out.println(e.getMessage());
}
catch (IllegalStateException e) {
  System.out.println(e.getMessage());
}

一般に、「キャッチ」ブロックは、特定のものから開始するか、発生する可能性が非常に高いものから、より一般的なものへと変更する必要があります。

さらに、例外を「スロー」して、例外が発生したメソッドがそれを処理しないようにすることもできます。 Java ランタイム)。

置き換えたいのが「if」ステートメントである場合は、「switch」ステートメントをお勧めします。

switch (choice) {
    case 1:  N95.loadDeduct(load);
             break;
    case 2:  N95.loadDeduct(load, greet);
             break;
    default: System.out.println("Invalid Option!!!");
}
于 2009-05-08T04:04:48.670 に答える
1

メソッドは、いくつかのScanner.nextInt()例外をスローできます。API 仕様のリンクされたページには、スローされる可能性のある 3 つの例外がリストされています。

たとえば、"one"代わりになどの整数以外の値が入力され1た場合、InputMismatchExceptionがスローされる可能性があります。

一般にtry-catch、次のコードに示すように、a は例外をキャッチするために使用されます。

try
{
    Integer.parseInt("one");      // Statement that can cause an exception.
}
catch (NumberFormatException e)   // Specify which exception to catch.
{
    // Code to handle the NumberFormatException.
}

例外の詳細については、Java チュートリアルのレッスン: 例外を参照してください。特に、例外のキャッチと処理セクションが役立つ場合があります。

于 2009-05-08T04:16:58.703 に答える
1

このコードに例外を追加しても、あまり価値はありません。私が考えることができるのは次のようなものです:

public static void main (String [] args){

.....

try{
 handleUserChoice(choice);//new method
}
catch(InvalidChoiceException e){
 System.out.println("Invalid Option!!!");
}
}
于 2009-05-08T04:18:14.677 に答える
0

とてもシンプルです。まず、例外が必要な場所を特定します。ライブラリ コードによってスローされる例外が存在する場合もあれば、独自の例外をスローする場合もあります。次に、それを処理するために try .. catch を使用します。これは、単純な「こんにちは、世界」のような例です。

public class TryTry {

    public void doIt() throws Exception {
       System.err.println("In the doIt method.");
       throw new Exception("Hello there!");
    }

    public static void main(String[] argv){
       TryTry t = new TryTry();
       // here we'll catch it.
       try {
           System.err.println("About to call doIt().");
          t.doIt();
       } catch (Exception e) {  // e now has your exception object
          System.err.println("In the exception handler.");
          System.err.println("Exception says: "+ e);
       }
    }
}

throw の効果は、その例外オブジェクトを構築し、キャッチされるまでスタックに送信することです。それをキャッチするには、それをスローする可能性のあるコードを で囲み、tr { ... }例外を で処理しますcatch

結果は次のとおりです。

javac TryTry.java && java TryTry
doIt() を呼び出そうとしています。
doIt メソッドで。
例外ハンドラで。
例外は言う: java.lang.Exception: こんにちは!
于 2009-05-08T04:02:20.783 に答える
0

if-else ブロックの代わりに例外を使用する理由がわかりません。switch ステートメントを使用してみると、見栄えが良くなります。

メソッド loadDeduct 内で発生する可能性のあるエラーを処理するには、例外を使用する必要があります。N95.loadDeduct を呼び出す行を try-catch ブロックで囲み、loadDeduct が失敗した場合に何が起こるかを記述します。

于 2009-05-08T04:08:40.767 に答える