2

私は OOP 方法論のテストを受け、次の True\False の質問を受けました。

「深い再帰呼び出しから戻るために例外をスローすることは、例外メカニズムの正当な使用と見なされます」.

アプリケーションの流れの例外ではないので間違っていると思いますが、深い再帰から戻る手っ取り早い方法だと先生に真と評価されました。

私の意見では、IndexOutofBounds を処理するときに for ブロックを try\catch でラップするのと似ていますが、これは正しいコーディングではありません。

あなたの意見ではどちらが正しいですか?

4

3 に答える 3

6

例外を使用して再帰から戻るのは間違っています。例外は、例外的な状況のためのものです。再帰から戻ることは例外的な状況ではありません。

Java 言語のチュートリアルから:

Java プログラミング言語は、例外を使用してエラーやその他の例外イベントを処理します。

例外とは、プログラムの実行中に発生し、命令の通常の流れを中断するイベントです。

プログラマーは例外的な状況で例外が使用されることを期待しているため、標準的なプログラミング慣行に反しており、間違っています。それ以外の使い方は間違っています。限目。

于 2013-07-16T13:53:20.380 に答える
1

私の考えでは、コードを明確にしようとする場合、例外の使用はエラー処理のために予約する必要があります。

しかし、深い再帰から戻るための例外の使用は、すべての呼び出しをアンスタックせずに再帰を終了できるようにするために、Caml プログラマーによって長い間使用されていました (無料で時間を無駄にしました)。

しかし今、再帰メカニズム (少なくとも Caml では) はインプレース再帰を導入しました。これは、再帰関数を呼び出すときに、それが終了している場合 (呼び出し後に計算がない場合)、スタック フレームが追加される代わりに置き換えられることを意味します。これは、すべての呼び出しをアンスタックする必要も、例外を使用してこれを回避する必要もなくなったことを意味します。

したがって、私の考えでは、例外はエラーを防ぐためにのみ使用する必要があります。他の使用法は現在では時代遅れになっているためです (少なくとも一部の言語では)。

于 2013-07-16T13:53:25.750 に答える
-2

これは Java と JVM の規則によって完全に正当であり、セマンティクスは明確です。ただし、これは制御フローに関するものであるため、OOP とはほとんど関係がありません。オブジェクト指向ではない言語でも同じ機能を使用できますが、たまたま例外があります。

ここで重要な点は、正当という言葉です。禁止されておらず、未定義の機能を悪用しないものはすべて正当であると言うなら、確かに、例外を飛び越えることは正当です。

それは意味しません: それは良い習慣です。しかし、それから....良い習慣は、Javaプログラマーの大多数が理解していることであり、これは多すぎません....

1 つだけ: Java で例外オブジェクトを作成すると、スタック トレース コレクションのためにコストがかかるため、頻繁に行う必要がある場合は、事前に作成されたユーザー定義の例外を使用してください。

于 2013-07-16T13:53:52.240 に答える