Javaと呼ばれる処理するために、堅牢なオブジェクト指向型メソッドを提供扱うJava例外異常な状況を。
1. Javaの例外とは何ですか?
プログラムの実行中に発生する可能性があり、例外エラーイベントがあり、それは通常の流れを破壊します。異常は、ユーザによる誤ったデータ入力、ハードウェア障害、ネットワーク接続障害などの状況で、様々な起因し得ます。
例外オブジェクトを作成するたびに、Java文を実行するときに発生したエラーは、その後、JREは、例外を処理する例外ハンドラを見つけようとします。適切な例外ハンドラが見つかった場合、オブジェクトは例外を処理する例外ハンドラのコードに渡され、それが言及する例外をキャッチ。ハンドラが見つからない場合、アプリケーションは、ランタイム環境、JREに例外をスローし、プログラムを終了します。
Javaの例外処理フレームワークは、エラーのため、例外処理フレームワークは、コンパイラのハンドルランタイムエラーに対処しません。
何それ2.Javaキーワードを例外処理?
Javaの例外処理は、4つのキーワードを使用しています。
スロー:時々 、私たちは間違いなく例外オブジェクトを作成したいと、通常の処理手順を止めるためにスローされます。スローキーワードは実行時例外処理をスローするために使用されます。
スロー:我々は方法でチェック例外をスローして処理されません場合は、我々は、呼び出し元プログラムが例外をスローすることを知っているように、メソッドシグネチャにキーワードをスロー使用する必要があります。これらの例外に対処するため、発信者の方法は、あなたが使用することができ
throws
、呼び出し元のメソッドにそれを伝播するためのキーワードを。throws節では、異常の複数を提供することができ、そしてそれはまた、とすることができる()メインメソッドとともに使用します。try-catch:私たちはのtry-catchブロックの例外処理コードを使用します。ブロックが開始され、漁獲量は、tryブロックの終了時に異常のための処理であるしてみてください。私たちは、catchブロックの複数をキャプチャしよう、とのtry-catchブロックはネストすることも可能にすることができます。例外のcatchブロックがあるべき種類のパラメータが必要です。
最後に:finallyブロックはtry-catchブロックで、オプションです。異常なポーズの実行プロセスに、私たちは、あなたがfinallyブロックを使用できるようにリソースの一部が、閉じられません開くことができます。例外が発生したかどうかにかかわらず、finallyブロックは必ず実行されます。
3. Javaの例外の階層構造を説明しますか?
Javaの例外は、例外の種類を分類するために使用される階層、継承されています。
Throwable
例外のJavaクラス階層の父は、2つのサブオブジェクトを持っている、である-Error
とException
。異常および異常動作は、さらに、異常に分割します。
エラーは、アプリケーションの範囲を超えた特別なケースであり、そのようなハードウェア障害、JVMのクラッシュまたはメモリエラーなど、予期せぬから回復します。
チェック例外は、私たちが異常な状況を期待して、このようなにFileNotFoundExceptionとして、プログラムにプログラムから回復しようとすることができるということです。私たちは、例外をキャッチし、有用な情報をユーザーに提供し、適切にデバッグ用に記録しなければなりません。Exception
すべては、親クラス「を、例外をチェックします」。
ランタイム例外が誤ったプログラミングによって引き起こされた、例えば、配列からの要素を取得しよう。要素を取得しようとする前に、まずそれ以外の場合はあり、配列の長さをチェックする必要がありArrayIndexOutOfBoundException
、実行時にスローされます。RuntimeException
すべてのランタイムの異常な親クラス。
方法4.Java例外クラスは重要なのですか?
なし例外とすべてのサブクラスは、任意の特定の方法を提供し、すべてのメソッドは、基本クラスのThrowableで定義されています。
- getMessage文字列() -このメソッドは、文字列のThrowableメッセージを返し、そのコンストラクタを作成することにより、メッセージときに異常を提供することができます。
- getLocalizedMessage文字列() -このメソッドは、呼び出し元のプログラムにロケール固有のメッセージを提供するために、それを上書きすることができ、サブクラスを提供します。のみ使用して、この方法のThrowableクラスの実装
getMessage()
例外メッセージを返すようにする方法を。 - Throwable getCauseは同期() -このメソッドは、(理由は不明である)、nullまたは異常の原因を返します。
- ToStringメソッド列() -このメソッドは、フォーマットに関する文字列のThrowable情報を返し、クラスThrowableのローカライズされたメッセージの名前を含む文字列を返します。
printStackTraceボイド() -このメソッドは、標準エラーストリームに印刷されたトレース情報をスタックします、このメソッドはオーバーロードされている、我々は、スタックトレース情報へのパラメータは、ファイルまたはストリームに書き込まれるとのPrintStreamまたはPrintWriterを渡すことができます。
5. Javaの7 ARM機能のキャプチャとマルチブロックを説明しますか?
あなたは、単一のtryブロックで異常の多くをキャッチした場合は、catchブロックのコードは非常に醜い、および冗長コードから構成されていることに気づくだろう間違った構図を記録するために使用され、Javaの7の機能の一つは、よりであることを覚えておいてください我々は、単一のcatchブロックで異常を複数取り込むことができるブロックをキャプチャします。次のようにこの機能を持つcatchブロックは次のようになります。
catch(IOException | SQLException | Exception ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
ほとんどの場合、我々は最終的にちょうどリソースを閉じるためにブロックを使用、我々は時々それらをオフにして、資源が枯渇した例外のとき、実行を取得することを忘れ。デバッグが困難これらの異常は、我々はそれをオフにすることを保証するために、このタイプのリソースを使用してそれぞれの場所を調査する必要があるかもしれません。したがって、1つの改善のJava 7は、トライ・リソースで、我々はtry文自体にリソースを作成し、try-catchブロックでそれを使用することができます。ときにtry-catchブロックからの実行は、ランタイム環境が自動的にこれらのリソースをオフにします。このような改良の一例としてのブロックキャッチ試してください。
try (MyResource mr = new MyResource()) {
System.out.println("MyResource created in try-with-resources");
} catch (Exception e) {
e.printStackTrace();
}
中6.Javaはチェックして異常な未確認の違いは何ですか?
1、異常がtry-catchブロックが呼び出し側は、キーワードがスローされる可能性がありますがチェック例外をスロー知っているように、それ以外の方法を使用する必要があり、コード内で処理されて使用する必要があります。チェックされない例外は、プログラムの処理を必要としない、あなたは、メソッドのthrows節で言及する必要はありません。
2.、例外はすべてチェック異常のスーパークラスですが、RuntimeException
すべての未確認の例外のスーパークラスです。RuntimeExceptionは、Exceptionのサブクラスである、注意してください。
3、チェック例外は、あなたのコード内でプログラムエラー処理を必要としているか、コンパイル時エラーを取得します。たとえば、あなたがファイルを読むためにFileReaderのを使用する場合、ファイルがスローされる可能性がありFileNotFoundException
、我々は、try-catchブロックで捕捉されなければならないか、呼び出し元メソッドに再びそれを投げます。未確認の例外は、通常のメソッド呼び出しオブジェクト参照ではなく、それがnullではないことを確認、原因NullPointerExceptionが発生して、例えば、貧弱なプログラミングによって引き起こされます。例えば、私は、文字列内のすべての母音を削除する方法を書くことができます。空の文字列を渡していないオブジェクトは、呼び出し側の責任であることを確認してください。私はこれらの状況にアプローチを変更する場合がありますが、理想的には、呼び出し側はこのことを認識する必要があります。
それは何7.Javaの違いはスローで、投げますか?
キーワードはメソッドが例外をスローし、実行するために引き渡さ際のキーワードは、プログラムの流れ、処理、例外オブジェクトを中断するために使用されて投げることを宣言するために一緒に投げるとメソッドを使用します。
8.どのようにJavaの持つカスタム例外を書くには?
私たちは、拡張することができException
、それが私たちのカスタム例外クラスを作成するクラスまたは任意のサブクラスを。カスタム例外クラスは、それ自身の変数とメソッドは、エラーコードまたは例外ハンドラへの異常に関連する他の情報を転送するために使用することができていてもよいです。
簡単な例では、カスタム例外の下に表示されます。
package com.journaldev.exceptions;
import java.io.IOException;
public class MyException extends IOException {
private static final long serialVersionUID = 4664456874499611218L;
private String errorCode="Unknown_Exception";
public MyException(String message, String errorCode){
super(message);
this.errorCode=errorCode;
}
public String getErrorCode(){
return this.errorCode;
}
}
9. JavaのOutOfMemoryErrorが発生しては何ですか?
JVMのヒープメモリが不足している場合のJavaのOutOfMemoryErrorがjava.lang.VirtualMachineErrorのサブクラスである、それはJVMがスローされます。私たちは、Javaのオプションは、より多くのメモリを提供して変更することによって、このエラーを解決することができます。
$>java MyProgram -Xms1024m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=256m
10.異なる状況がどのようなものですが、「メインスレッドの例外」につながりますか?
いくつかの一般的なスレッドの主な例外は以下のとおりです。
- メインスレッドjava.lang.UnsupportedClassVersionError異常:あなたのJava JDKコンパイラの別のバージョンからのクラス、そしてあなたは、Javaの別のバージョンから、それを実行しようとすると、この例外が発生します。
- メインスレッドjava.lang.NoClassDefFoundErrorが異常:この例外の二つの変種があります。最初は、クラスの位置。クラス拡張のフルネームをご提供することです。クラスが見つからないときに、第2のケースがあります。
- メインスレッドjava.lang.NoSuchMethodErrorの例外:あなたはクラスのmainメソッドを持っていない実行しようとすると、この例外が発生します。
- メインスレッドは例外をjava.lang.ArithmeticException:任意の例外はmainメソッドからスローされるたびに、それはコンソールの例外を出力します。最初のセクションでは、mainメソッドは例外メッセージがコロンの後に印刷され、例外、印刷例外クラス名の第2の部分をスロー記述する。
11.Java決勝、最終的に確定し、違いは何ですか?
最後の、そして最後には、Javaキーワードである、と方法を確定します。
それらは再割り当てすることができないように、最終的なキーワードのクラス変数を併用してもよい;クラスによってクラスを回避延び、最終的な
キーワードは方法で覆うことができるサブクラスを回避します。最後にキーワード声明を提供するために、try-catchブロックを使用することができますが、常に何らかの異常があっても実行され、通常、最終的にリソースを閉じるために使用されます。
オブジェクトが破棄される前に確定()メソッドは、ガベージコレクタによって実行され、良い方法のすべてのグローバルリソースを閉じてくださいです。
3のうち、唯一の最後に例外は、Javaに関連する取り扱い。
mainメソッドが例外をスローしたとき12.どうなりますか?
main()メソッドは例外をスローする場合、Javaランタイムは、プログラムを終了し、システムコンソールに例外メッセージとスタック・トレースを印刷します。
13.私たちは、空のcatchブロックにそれを持っていること?
私たちは、空のcatchブロックを持つことができますが、これは最悪のプログラミング例です。私たちは決して空のcatchブロック、ブロックは例外が捕獲されている場合、我々は例外に関する情報を持っていないので、デバッグが、それは悪夢である必要があります。そこコンソールに記録されている例外の詳細に少なくともログ・ステートメントであるか、またはファイルをログインする必要があります。
14.ベストプラクティス、それを扱ういくつかのJava例外を提供しますか?
Javaの例外処理に関連するベストプラクティスのいくつかは次のとおりです。
- キャプチャ具体的な異常はデバッグを容易にすることができます。
- プログラムでは、できるだけ早く(高速ファースト)例外をスローします。
- 例外をキャッチするためのプログラムの後半では、呼び出し側が例外を処理しましょう。
- リソースがシャットダウンされていることを確認、またはそれらを適切に閉じるようにブロック最終的に使用するには、Java 7 ARM機能を使用します。
- デバッグのため、必ず記録例外メッセージ。
- コードをよりきれいにするために複数のcatchブロックを使用します。
- カスタム例外を使用するアプリケーションのAPIからの例外の一つのタイプによって引き起こされる可能性があります。
- 常に例外を終了し、命名規則に従ってください。
- Javadoc @throwsは、プロセスに起因する異常を用いた記録します。
- 高価な異常なので、例外がスローされた場合にのみ、それは理にかなっています。そうしないと、あなたはそれらをキャプチャして、nullまたはいない応答を返すことができます。
15.問題は何ですか、どのように我々は、以下の手順で解決していますか?
ここで、我々は、Javaの異常に関連したいくつかのプログラミングの問題を検討します。
1)。以下の手順の問題は何ですか?
package com.journaldev.exceptions;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestException {
public static void main(String[] args) {
try {
testExceptions();
} catch (FileNotFoundException | IOException e) {
e.printStackTrace();
}
}
public static void testExceptions() throws IOException, FileNotFoundException{
}
}
上記コンパイルされないと、エラーメッセージが表示され、「例外にFileNotFoundExceptionがすでに代替にIOExceptionでキャッチされました」。IOExceptionにFileNotFoundExceptionのサブクラスでは、この問題を解決するには2つの方法がありますされているためです。
第一の方法は、単一の二異常なcatchブロックを使用することです。
try {
testExceptions();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
もう一つの方法は、より多くのブロックをキャプチャするにFileNotFoundExceptionから削除することです。
try {
testExceptions();
}catch (IOException e) {
e.printStackTrace();
}
あなたは、状況に応じてどちらかの方法を選択することができます。
2)。次のプログラムは、問題は何ですか?
package com.journaldev.exceptions;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.bind.JAXBException;
public class TestException1 {
public static void main(String[] args) {
try {
go();
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
public static void go() throws IOException, JAXBException, FileNotFoundException{
}
}
FileNotFoundExceptionをはIOExceptionが、FileNotFoundExceptionをキャッチブロック、したがって、アクセスできないのサブクラスであるため、プログラムは、コンパイルエラーになり、エラー・メッセージが表示さ「にFileNotFoundExceptionのための到達不能catchブロックを。それはすでにのIOExceptionのためのcatchブロックによって処理されます」。
あなたはこの問題を解決するためのcatchブロックの順序を修正する必要があります。
try {
go();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
メモ、または持つJAXBExceptionにIOExceptionにFileNotFoundException、catchブロックに関連付けられていない任意の位置よりも階層に配置することができます。
3)。次のプログラムは、問題は何ですか?
package com.journaldev.exceptions;
import java.io.IOException;
import javax.xml.bind.JAXBException;
public class TestException2 {
public static void main(String[] args) {
try {
foo();
} catch (IOException e) {
e.printStackTrace();
}catch(JAXBException e){
e.printStackTrace();
}catch(NullPointerException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
public static void foo() throws IOException{
}
}
持つJAXBExceptionがチェック例外であるため、プログラムがコンパイルされません、とのfoo()メソッドは、呼び出し元のメソッドをキャプチャするために、この例外をスローする必要があります。あなたはアクセスできないエラーメッセージ「キャプチャブロック持つJAXBExceptionを受け取ることになります。これは、try文の本体から例外をスローしません。
この問題を解決するには、持つJAXBExceptionのcatchブロックを削除する必要があります。
それは未チェックの例外であるため、キャプチャNullPointerExceptionが効果的であることに注意してください。
4)。以下のプログラムでは、問題は何ですか?
package com.journaldev.exceptions;
public class TestException3 {
public static void main(String[] args) {
try{
bar();
}catch(NullPointerException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
foo();
}
public static void bar(){
}
public static void foo() throws NullPointerException{
}
}
これはトリッキーな質問、問題ありません、それは正常にコンパイルされるコードです。私たちは、いつものようにもメソッドのthrows節ではそれがない場合でも、例外または任意の未チェックの例外をキャプチャすることができます。
内法(FOO)文の未チェックの例外がthrows節同様に、もし、その例外はプログラムで必須ではありません扱います。
5)。次のプログラムは、問題は何ですか?
package com.journaldev.exceptions;
import java.io.IOException;
public class TestException4 {
public void start() throws IOException{
}
public void foo() throws NullPointerException{
}
}
class TestException5 extends TestException4{
public void start() throws Exception{
}
public void foo() throws RuntimeException{
}
}
異なるサブクラスは()メソッドのシグネチャを開始するため、上記プログラムは、コンパイルすることができません。この問題を解決するために、我々は法の特性の変化をサブクラス化することができ、あなたはまた、サブクラスから句をスローし、以下に示すように、スーパークラスメソッドは、同じである削除することができます。
@Override
public void start(){
}
6)。次のプログラムは、問題は何ですか?
package com.journaldev.exceptions;
import java.io.IOException;
import javax.xml.bind.JAXBException;
public class TestException6 {
public static void main(String[] args) {
try {
foo();
} catch (IOException | JAXBException e) {
e = new Exception("");
e.printStackTrace();
}catch(Exception e){
e = new Exception("");
e.printStackTrace();
}
}
public static void foo() throws IOException, JAXBException{
}
}
マルチキャプチャブロック例外オブジェクトが究極の目標であるため、上記のプログラムをコンパイルすることはできません、私たちはその値を変更することはできません。、コンパイル時エラー「複数のキャプチャブロックパラメータEを割り当てることができません」など。
私たちは、このエラーを解決するために、新しい例外オブジェクトに割り当てられた「E」を削除する必要があります。
「短いステップ、千マイルは、」あなたができる将来の希望は:どこでも夢の馬の生息地を持っています!、ジュニアさあ!
いいえ公共の懸念:「ジャワの親友」、更新毎日のJavaの知識はああ、あなたの到着を楽しみにしていません!
- 「送信グループを 10万人のプログラマーとの進展を」。
- 「送信インタビューを情報BATJのインタビュー、ビデオインタビューレイダースを受け取るために」。
- 「送信楽しいアルゴリズムをビデオチュートリアルの「楽しいアルゴリズム」シリーズを受け取るために」。
- 「送信しない1024」...