Javaで例外を正しく使用する方法を教えてください。 部分的にこの資料はインターネット上で検討されており、書籍J. Bloch Effective Javaでも少し説明されています 。 チェック済みおよび未チェックの例外を使用することについてです。 この記事は、初心者にとって便利です。 最初は、例外を正しく使用する方法が必ずしも明確ではありません。
例外のJava階層は次のとおりです。すべてのThrowableの親クラス。 2つのクラスがそこから継承されます:例外とエラー。 RuntimeExceptionは、Exceptionクラスから継承されます。
エラー-システムで発生する可能性のある重大なエラー(StackOverflowErrorなど)。 原則として、システムはそれらを処理します。 それらが発生した場合、この状況では作業を続行できないため、アプリケーションが閉じられます。
例外はチェック例外です。 つまり、メソッドがExceptionから継承された例外(IOExceptionなど)をスローする場合、このメソッドはtry-catchブロックで囲む必要があります。 例外をスローするメソッド自体には、署名にthrowsコンストラクトが含まれている必要があります。 チェックされた例外は、例外が予見される可能性があることを意味し、それに応じて処理する必要があり、アプリケーションは引き続き動作する必要があります。 このような例外の例は、既に存在する新しいファイルを作成しようとする試みです(IOException)。 この場合、アプリケーションを続行し、ファイルを作成できなかった理由をユーザーに通知する必要があります。
例:
try { File.createTempFile("prefix", ""); } catch (IOException e) { // Handle IOException } /** * Creates an empty file in the default temporary-file directory * any exceptions will be ignored. This is typically used in finally blocks. * @param prefix * @param suffix * @throws IOException - If a file could not be created */ public static File createTempFile(String prefix, String suffix) throws IOException { ... }
この例では、ファイルを作成できないときにcreateTempFileメソッドがIOExceptionをスローできることがわかります。 そして、この例外はそれに応じて処理する必要があります。 try-catchブロックの外側でこのメソッドを呼び出そうとすると、コンパイラーはエラーをスローし、2つの修正オプションが提供されます:メソッドをtry-catchブロックで囲むか、File.createTempFileが呼び出されるメソッドはIOExceptionをスローする必要があります(トップレベルに渡すため)処理)。
RuntimeExceptionは未チェックの例外です。 それらは実行時に発生します。 このような例外には、たとえばNullPointerExceptionが含まれます。 try-catchブロックにバインドする必要はありません。 RuntimeExceptionが発生した場合、これはプログラマーが犯した間違い(初期化されていないオブジェクト、配列から出るなど)を示します。 そのため、この例外を処理する必要はありませんが、例外が再度発生しないようにコード内のエラーを修正する必要があります。
以下は、RuntimeExceptionの操作方法の例です。
/** * Calculates rectangle square * @param aRect Rectangle * @throws NullPointerException if Rectangle is null */ public int calculateSquare(Rectange rect) { if (rect == null) { throw new NullPointerException(“Rectangle can't be null”); } // calculate rectangle square int rectWidth = rect .getWidth(); int rectHeight = rect .getHeight(); int square rectWidth * rectHeight(); return square; } ... Rectangle rect = new Rectangle(); int square = calculateSquare(rect); ….
この例では、メソッドはRectangleクラスのオブジェクトを受け入れます。 メソッドの説明には文字列@throwsが含まれています。これは、スローできる例外と、どのような条件下での例外を説明しています。 ただし、メソッドシグネチャにはthrowsコンストラクトが含まれていません。 これは、メソッドが呼び出されたときに、try-catchブロックでラップする必要がないことを意味します。 また、プログラマーは、初期化されていないオブジェクトがメソッドに転送されるのを防ぐ必要があります。
例外を処理する必要がある場合、およびコードのエラーを修正する必要がある場合に、このような小さな説明が少し理解できることを願っています。