最終:多型スイッチを無効にします〜
変数の変更:変数を変更できません
クラスの変更:クラスを継承することはできません
変更方法:メソッドを書き直すことはできません
最後に:例外処理で使用された最後のステートメントブロック
例外が生成されるかどうかにかかわらず、実行する必要があります~~~
Javaコード
public final class finalltest {public static void main(string [] args){try {throw nullpointerexception(); } catch(nullpointerexception e){system.out.println( "プログラムが例外をスローする"); }最後に{system.out.println( "最終的なステートメントブロックが実行された"); }}}Javaでの最終的なキーワードの使用
他の言語モデルと比較して、最終的にキーワードはJava例外処理モデルへの最適な追加です。最終的な構造により、例外が発生するかどうかに関係なく、コードは常に実行できます。最終的に使用して、オブジェクトの内部状態を維持し、非メモリリソースをクリーンアップします。最終的には、コードが混乱します。たとえば、次のコードでは、最終的に使用せずに非メモリリソースを無料で使用するためにコードを作成する方法を示しています。
java.net。*; java.io。*; class withofinally {public void foo()throws ioException {//無料のポートサーバーソケットss = new Serversocket(0); try {socket socket = ss.accept(); //ここに他のコード...} catch(ioexception e){ss.close(); // 1スローe; } // ... ss.close(); // 2}}このコードはソケットを作成し、受け入れメソッドを呼び出します。メソッドを終了する前に、リソースの脆弱性を回避するためにこのソケットを閉じる必要があります。このタスクを達成するために、メソッドの最後のステートメントである// 2に近いと呼びます。しかし、Tryブロックで例外が発生した場合はどうなりますか?この場合、// 2のクローズコールは起こりません。したがって、この例外を再発行する前に、この例外をキャッチし、// 1を閉じるために別の呼び出しを挿入する必要があります。これにより、メソッドを終了する前にソケットが閉じられます。
このようなコードを書くことは面倒でエラーが発生しやすいですが、最終的には不可欠です。残念ながら、最終的にメカニズムのない言語では、プログラマーはこの方法でコードを整理するのを忘れて、リソースの脆弱性をもたらす可能性があります。 Javaの最終的な条項は、この問題を解決します。最後に、以前のコードを次の形式に書き換えることができます。
java.net。*; java.io。*; class withfinally {public void foo2()throws ioexception {//無料のポートサーバーソケットss = new Serversocket(0)にソケットを作成します。 try {socket socket = ss.accept(); //ここに他のコード...}最後に{ss.Close(); }}}最終的なブロックは、TRYブロック内で例外が発行されるかどうかに関係なく、緊密なメソッドが常に実行されることを保証します。したがって、メソッドを終了する前に、緊密な方法が常に呼び出されることが保証されます。このようにして、ソケットが閉じられており、リソースが漏れていないことを確認できます。この方法では、別のキャッチブロックは必要ありません。キャッチブロックは、ソケットを閉じるためだけに最初の例で提供されますが、これは最終的に閉じられています。キャッチブロックを提供すると、キャッチブロックが終了した後に最終的なブロックのコードが実行されます。
最終的なブロックは、トライまたはトライ/キャッチブロックで使用する必要があります。さらに、最終的なブロックを実行せずにTryブロックを終了することはできません。最終的にブロックが存在する場合、常に実行されます。 (このステートメントはその観点からは正しいです。最終的なブロックを実行せずにTryブロックを終了する方法があります。コードがSystem.Exit(0)を実行する場合、TRYの内部でステートメントを実行すると、アプリケーションは最終的な実行を実行せずに終了します。