#例外とは何ですか?
Java の基本的な考え方として、構造が不十分なコードは実行できないというものがあります。 エラーを見つけるのに最適な時期はコンパイル中です。ただし、コンパイラはすべてのエラーを検出できるわけではないため、プログラムの実行中に残りの問題を解決する必要があります。これには、エラーが何らかの方法で処理のために適切な情報を特定の受信者に渡すことができる必要があります。 Java における例外処理の目的は、少量のコードを使用して、大規模で信頼性の高いプログラムの生成を簡素化することです。このようにして、アプリケーションに未処理のエラーがなく、明らかなエラーも発生します。利点: エラー処理コードの複雑さが軽減されます。 異常とは、文字通りの意味によれば、予期せぬことを意味します。コード レベルで理解するには、現在のメソッドまたはスコープが実行を継続できないようにします。例外とは、プログラムが意図した実行で機能しなくなる原因となるイベントです。例外には、チェック例外、エラー、実行時例外の 3 種類があります。 Java では、例外はオブジェクトとして扱われ、その基本クラスは Throwable です。Java の例外タイプ
Java は、Throwable から直接 Exception と Error を派生します。このうち、Exception はスローされる基本的な型であり、Java のクラス ライブラリ、メソッド、実行時のエラーなどで例外型の例外がスローされることがあります。例外は、コンパイラによって捕捉できる回復可能な例外を表します。エラーは、コンパイル時およびシステム エラーを表し、システムの実行中に重大なエラーが発生したことを示します。これは回復不可能なエラーです。 JVM レベルなので、このエラーによりプログラムの実行が終了します。例外は、チェック例外と実行時例外に分けられます。 例外クラスの構造階層図は次のとおりです。 代表的な RuntimeException (実行時例外) には、NullPointerException、ClassCastException (型変換例外)、IndexOutOfBoundsException が含まれます。 (範囲外例外) Exception)、IllegalArgumentException (不正なパラメータ例外)、ArrayStoreException (配列ストレージ例外)、AruthmeticException (算術例外)、BufferOverflowException (バッファ オーバーフロー例外) など;Non-RuntimeException(チェック例外) には、IOException、SQLException、InterruptedException (呼び出しスレッドがスリープしているときの中断例外)、NumberFormatException (数値フォーマット例外) などが含まれます。 コンパイラのチェック方法により、例外はチェック例外(CheckedException)とチェックされない例外(UncheckedException)に分けられます。 Error と RuntimeException の組み合わせは UncheckedException と呼ばれます。コンパイラはメソッドがこれら 2 種類の例外を処理するかスローするかをチェックしないため、このように呼ばれます。したがって、コンパイル中にこの種類の例外が発生してもエラーは報告されません。デフォルト仮想マシンは処理メソッドを提供します。 Error と RuntimeException の 2 種類の例外を除いて、その他の例外はチェック例外と呼ばれます。 #Java による例外の処理方法
1. try-catch、try-finally、try-catch-finally
チェックされた型の例外の場合は、それを処理するか、メソッド ヘッダーで throws を使用する必要があります。
public static void createFile() throws IOException{ File file = new File("C:/test.txt"); if(!file.exists()){ file.createNewFile(); } } public static void main(String[] args) { try { createFile(); } catch (IOException ex) { // handle exception here } }
catch に関する注意点がいくつかあります:
1) パラメーターの例外タイプは、Throwable クラスまたはそのサブクラスである必要があります。
2) catch ステートメントを上から下に記述する場合、パラメーターの型はサブクラスから親クラスの順序である必要があります。これは、型が一致すると、後続の catch は無視されるためです。たとえば、IOException は Exception の前に配置する必要があります。そうしないと、コンパイラによってエラーが報告されます。
3) では、1 つ以上の catch ステートメントを使用できます。finally ステートメントがある場合でも、try-finally などの catch ステートメントを使用することはできません。
複数の例外をキャッチしたい場合は、複数の catch ステートメントを使用できます。JDK7 以降では、マルチキャッチという別の方法が提供されます。
try{ // other code } catch (IOException | SQLException ex) { throw ex; }
4).例外を無視しないでください。ファイルの状態を変更していないため、回復アクションを実行する必要がなく、必要な情報がファイルから読み取られているため、FileInputStream を閉じる場合を除き、空の catch ブロックは例外の目的を無効にします。したがって、進行中の操作を終了する必要はありません。
finally に関する注意点がいくつかあります:
1) try または catch ステートメントの実行時に仮想マシンが終了しない限り、finally のコードは常に実行されます (System.exit(1) ))。
2).finally ブロックは、ファイルを閉じる、カーソルを閉じるなど、リソースのクリーンアップ作業を実行できます。
3)、最終的にブロックは必要ありません。
また、tryブロックとfinallyブロックの両方でreturn文を実行した場合、最終的な戻り値はfinallyの戻り値となります。
2. 例外チェーン
常常想要在捕获一个异常后抛出另外一个异常,并且希望把原始异常信息保存下来,这就是异常链。在JDK1.4以后,Throwable子类在构造器 中可以接受一个cause对象作为参数,表示原始异常,通过这样把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链 追踪到异常最初发生的位置。
但在Throwable子类中,只有Error, Exception, RuntimeException三类异常类提供了带cause参数的构造器,其它类型的异常则需要通过initCause()方法。例如定义了CustomException类,可以这样使用:
CustomException cmex = new CustomException(); cmex.initCause(new NullPointerException); throw cmex;
这样一来,CustomException继承自Exception或RuntimeException,就属于自定义异常了。
一般来说,自定义异常的作用有以下情形:
1)、将检查型异常转换为非检查型异常。
2)、在产生异常时封装上下文信息、定义异常码、收集环境对象,有利于信息的传递。
异常使用指南
1、在知道该如何处理的情况下才捕获异常。
2、自定义异常类型,用以封装所有的检查型异常。
3、在程序的边界进行异常捕获。如服务端相应客户端的请求,在出口处catch内部有可能产生的异常,并统一throw一个封装过的异常给客户端,免得暴露服务端敏感信息。
4、只针对异常的情况才使用异常。不要在所有的代码中习惯性地使用try-catch,因为这会影响性能。
5、抛出与抽象相对的异常。如果方法抛出的异常与它执行的任务没有明显的联系,这种情形会使人不知所措。为了避免这个问题,更高层的实现应该捕获 低层的异常,同时抛出可以按照高层抽象进行解释的异常,这种做法被称为异常转译(exception translation),如下:
try{ // use lower-level abstraction to do our bidding } catch(LowerLevelException ex){ throw new HigherLevelException(...); }
另外一种特殊的异常转译称为异常链,上面已作描述。如果低层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。高层的异常提供访问方法(Throwable.getCause)来获得低层的异常。
6、每个方法抛出的异常要有文档描述。利用Javadoc的@throws标记,记录抛出每个异常的条件。如果一个方法可能抛出多个异常,不要使 用这些异常类的某个超类。如不要声明一个方法“throws Exception”或“throws Throwable”,这将没有任何指导信息。
以上がJavaの例外とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。