2016-06-16 18 views
0

チェックされている例外だけを捕捉し、チェックされていない例外は捕まえたくないという状況を想像することができます。私はそれを他のやり方でやっているとは本当に想像できません。RuntimeExceptionがExceptionを拡張するのはなぜですか?それ以外の方法はありません。

+0

例外は**すべての**例外のスーパークラスです – Li357

+1

これは私がJavaの設計者がそれを設計したのでこの方法で設計されました – ControlAltDel

+0

Andrew、はい、私は尋ねますなぜRuntimeExceptionはありませんか? @ControlAltDelはい、私は彼らがこのように設計した理由を尋ねます。 – Atom

答えて

4

チェックされた例外をキャッチしたり、再度スローしたり、コードをコンパイルできません。だからあなたのコード全体では、明示的にとにかく(スローまたはキャッチ)それらの各1つを処理する必要があります。

そして唯一確認された例外のための共通の親が存在しない理由のために:

は、彼らはあなたが明示的にそれぞれ1を処理します。

自分でメソッドを記述してみて、このメソッドでチェック例外をスローしました。その場合、メソッドのユーザーがこの例外のコードを使ってこの例外を明示的に処理することを期待します(例外を処理する関数のユーザーについて気にしなかった場合は、実行時例外がスローされます)。

したがって、チェック例外の考え方は、関数の作成者とユーザーの間の契約であり、ユーザーはこの例外を処理する必要があります。

+0

...または少なくともJava 7マルチキャッチで明示的に名前を付けること。それは理にかなっている。 http://www.oracle.com/technetwork/articles/java/java7exceptions-486908.html – Atom

2

私はあなたがすでにchecked vs non-checked exceptionsについて考えていることを期待しているので、非常に正確な答えをあなたに伝えようとします。 今すぐあなたの質問に来て、答えはRuntimeExceptionも例外であるので、論理的にも設計上の賢明にも簡単です。 JavaがOOPの原則であることはわかっているので、ここでは基本的に継承です。実行時例外は、親からの例外処理動作をオーバーライドしたこととは別に、Exceptionクラスにあるすべての機能を備えており、未チェックの動作です。チェックされた例外とチェックされていない例外は、ハンドリングの方法が異なりますが、JavaのExceptionであることの残りのプロパティは両方で同じです。だから私は簡単なOOPsの設計(継承の原則)と2つの間の関係は論理的に正しいと言うでしょう。

ExceptionErrorクラスで同じことを観察することができます。ここでJavaでこれらの2つの意味について話す場合、例外は回復または処理できるものですが、エラーは回復できないものです。エラーから回復するには、アプリケーションを再起動する必要があります。しかし、もう一度、両方ともThrowableクラスを継承していることがわかります。なぜなら両方とも同じプロパティを持ち、両方が投げられる可能性があるからです。ハンドリングが異なります。一方は処理できない一方、他のオブジェクトは処理できないという理由で、Exception hierarchyその他はError hierarchyです。あなたのquestioin用SO

enter image description here

、私はそのOOPSデザインは、RuntimeExceptionが、私はJavaでの例外の開発者であったとしても、論理的に正しいExceptionクラスから継承していると言うだろうし、私も設計している必要がありますこれらのクラスは既に同じ方法で行われています。

希望あなたの質問に答えているかもしれません。

+0

+1努力していますが、ExceptionとRuntimeExceptionが表示されたツリー上の場所を切り替えることができなかった理由は正確には解りません。理論的には、チェックされた例外処理の動作をオーバーライドするRuntimeExceptionの代わりに、RuntimeExceptionのサブクラスとしてのExceptionは親に対して「チェックされた」動作を追加するだけでよい。 – Atom

+0

@Atom ,,,私は今あなたの質問を持っているので、私たちは親としてRuntimeExceptionを持っている場合、論理的にはすべての子クラスもランタイムでなければならないが、次にコンパイル時に扱わなければならないIOExceptionのようなチェック例外しかし、もしExceptionクラスが親クラスであれば、すべての子クラスも例外の型であると言われていますが、コンパイル時(コンパイル時)またはアンチェック(実行時)のどちらでもかまいません。 – pbajpai21

2

のJavaは、compiled and interpreted言語

  • ジャワ代わりにバイトコードを実行するために実行JVMによって解釈されなければならないcompilation時間
  • で中間byte codeからcompiledされます。

これは、チェックされた理由とチェックされていない例外についてコンパイルしていないため、interpreted(ここではチェックされていない例外が発生します)部分が表示されません。 Javaの

Javaの例外階層

java exception hierarchy

Unchecked例外は(私達はちょうど約Exception階層を語る)、それらの例外その取り扱いNOT verified during Compile timeです。これらの例外は、プログラミングが悪いために発生します。プログラムはコンパイルエラーを出さないでしょう。 Uncheckedの例外はすべて、の直接サブクラスです。RuntimeExceptionクラスです。

enter image description here

+0

上記の図が正しいことを知っていますが、ExceptionとRuntimeExceptionの場所を切り替えると、チェックされていない動作がより論理的に見えます。 – Atom

+1

@Atom 'RuntimeException'を' Exception'に置き換えた場合、 'runtime' **スーパークラスがある場合はスーパークラスが意味のある名前でなければなりません。 'Exception'サブクラスを持つことができますが、ここでは' Exception'の動作があります。なぜなら、あなたがカスタム例外を作成した場合のその良い習慣が 'classname'の後に' exception'を追加する理由です – Hosseini

0

APIを設計しながら、開発者が考慮すべての条件を取る必要があります。 Exceptionは、プログラムの実際のフローからの逸脱とみなされます。だから彼ら(Java APIの設計に携わった開発者)は条件を異なるカテゴリに分けました。コンパイル時に処理できるものと開発者は、このAPIを使用している人にコンパイル時にのみ処理させる必要があります。 (実行時間/チェックされていない例外)と処理できないもの(エラー)を実行時に処理する必要があります。

たとえば、ファイルをアップロードする必要があるというアプリケーションを設計しています。私たちはJAVAを使用しています。この場合、ファイル入力ストリームを使用して、アップロード/ダウンロードする必要があるファイルのパスを指定することができます。開発者はファイル入出力ストリームスローファイル例外としてJava事前定義ファンクション(ファイル入出力ストリーム)を使用したため、コンパイラはコンパイル時にそれらを処理するようになりました。このアプリケーションのエンドユーザーファイルをアップロードしようとしていますが、利用できないパスや間違ったパスを与えた場合、その例外が発生し、ファイルが利用できないというメッセージを提供して処理すると、エンドユーザは簡単に処理できます。ここで、ユーザーが電卓アプリケーションを使用していると仮定すると、開発者は実行時に処理しようとするエンドユーザーの種類を認識しません。または無限大の場合は、算術例外が発生するので、値がサブミットされた後に実行時に入力自体が変更され、分割操作が行われます。

関連する問題