0

double lookup( int i); を実装する 2 つのクラスがあります。そして、質問を解決する際にその lookup(int i) を使用する場所、またはこの場合はルックアップ値を出力する場所です。このケースは配列用です。

したがって、例外のドキュメントまたは google/textbook を読み、次のコードが付属しています。

public double lookup(int i) throws Exception
{
    if( i > numItems)
        throw new Exception("out of bounds");
    return items[i];        
}

それを私のクラスに引き継ぎ、私のセットを出力してみます。ここで、セットは上のクラスで定義したオブジェクト タイプの名前です。

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        System.out.print(set.lookup(i) + ",");

    }
    System.out.print(set.lookup(set.size()));
}

印刷の最後の「、」を避けるために2つのprint()を使用していますが、

未処理の例外 Exception (私の例外の名前は Exception でした)

print() で例外をキャッチする必要があると思いますが、正しいフォーマットをオンラインで見つけることができません。書く必要がありますか

例外をキャッチする 例外? これは、キャッチ時に無効な型を示す構文エラーが発生するためです。

http://docs.oracle.com/javase/tutorial/essential/exceptions/のようなソース はほとんど役に立たず、テキストが何を伝えているのか理解できないようです。また、例のコーディングを実際に理解できる複数の例を含むソースを見つけるのにも苦労しています。

上記のキャッチフレーズのソース/例と、おそらく新しいJavaプログラマー向けの適切な例のソースを誰か教えてもらえますか? 私の本は恐ろしく、上記のキャッチフレーズのわかりやすい例をオンラインで見つけることができないようです.

4

4 に答える 4

1

私は例外をスローしません。

あなたの場合、 IndexOutOfBoundException または InvalidArgumentException がより良い選択です。これらはチェック例外ではないため、キャッチする必要はありません。

public double lookup(int i) {
    if(i >= numItems) // assuming numItems is not items.length
        throw new IndexOutOfBoundException("out of bounds " + i + " >= " + numItems);
    return items[i];        
}

注: チェックは>=

メソッドprint()は変更されずにコンパイルされます。

于 2012-09-27T09:34:04.473 に答える
1

例外とは

例外は例外的な条件です。通常では発生しない状態。お金を引き出すために行った例を考えてみましょう。あなたのアカウントには 100 の残高があり、200 を要求した場合、ATM は残高が不足していると通知するはずです。

例外の種類

  • チェック例外

    これらは、アプリケーションが回復したい状況です。上記の例のように、アプリケーションでエラーが発生し、引き続き動作します。

  • エラー

    これは、アプリケーションの外部にある例外的な状態です。OutOfMemoryError十分なメモリがなく、アプリケーションがメモリから回復できない場合を言います。

  • ランタイム例外/チェックされていない例外

    これらの例外はアプリケーション例外ですが、この場合、アプリケーションはそこから回復できません。たとえばNullpointerException、値が null で、何か厄介なことをしようとした場合。

したがって、上記の 3 つのチェック済み例外のみをキャッシュする必要があります。

Checked Exception をスローしてキャッチする方法

Exceptionまたは のサブクラスExceptionはチェック例外です。throw句を使用して、チェック済み例外をスローできます。throws例外をスローすると、句を使用してメソッド宣言にそれを含めることが必須になります。

したがって、このメソッドを使用したい人は誰でも、その例外を処理する必要があります。例外の処理とは、代替フローを呼び出すことを意味します。私たちの場合のように、ユーザーにテキストを表示しました"Error Invalid account number."

呼び出し関数は、throws呼び出しているメソッドによってスローされる例外の句を追加することにより、例外の伝播を選択することもできます。

Generate:
public static double withdraw(int i) throws Exception {
    if (i <= 0)// Out of bounds
        throw new Exception("Invalid Account Number");
    return 0.0;// something;
}

Handle:

try {
        withdraw(0);
    } catch (Exception e) {
        // do something with exception here.
        // Log the exception
        System.out.println("Error Invalid account number.");
    }

Propagate:
      public static double callWithdraw(int i) throws Exception {//Propagate exceptions
        return withdraw(i);
      }
于 2012-09-27T09:49:37.180 に答える
0

一般に、メソッドに渡された不適切な引数を示すには、 IllegalArgumentExceptionを使用します。これはRuntimeExceptionキャッチされるべきではありません。

この特定のケースでは、追加のコードを記述する必要はありません。ArrayIndexOutOfBoundsExceptionが不適切な配列アクセスを処理する必要があります。

配列が不正なインデックスでアクセスされたことを示すためにスローされます。インデックスが負であるか、配列のサイズ以上です。

于 2012-09-27T09:36:09.437 に答える
0

これを試して

try
{
    print(); //print() needs to throw the same exception
} catch(Exception e)
{
   //handle exception
   System.err.println(e.getMessage()+"\n\n"+e.printStackTrace());
}
//finally {
// cleanup here if you like
// }

またはこれ

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        try
        {
            System.out.print(set.lookup(i) + ",");
        } catch(Exception e)
        {
          //handle it here
        }
    }
    System.out.print(set.lookup(set.size()));
}

「スロー」を使用すると、簡単な方法であることに注意してください。これは、コーディングを簡単にする安価な委譲です...可能であれば、throw の代わりに常に try/catch を使用するようにしてください。

「スロー」で何かを使用するときはいつでも、最終的にはそれを try/catch ブロックに入れて適切に処理する必要があることに注意してください。

于 2012-09-27T09:32:12.843 に答える