【java解惑】try-finally文実行問題


次のコードを示します.
public class Example039 {

	public static void main(String[] args) {
		Example039 example039 = new Example039();
		System.out.println(example039.output1());
		example039.output2();
	}

	boolean output1() {
		try {
			// ...
			return true;
		} finally {
			return false;
		}
	}

	void output2() {
		try {
			System.out.println(" try , exit, ");
			System.exit(0);
		} finally {
			System.out.println(" finally , exit ");
		}

	}
}

出力結果:
false
 try , exit, 

プログラム分析:
1つのtry-finally文では、finally文ブロックは、常にtry文ブロックから制御権が離れるときに実行されます.try文ブロックが正常に終了しても、予期せぬ終了であっても、状況は同じです.try文ブロックとfinally文ブロックが予期せぬ終了になると、try文ブロックで予期せぬ終了を引き起こす原因は破棄され、try-finally文全体が予期せぬ終了になる原因はfinally文ブロックが予期せぬ終了になる原因と同じになります.output 1では、try文ブロック内のreturn文による予期せぬ終了は破棄され、try-finally文の予期せぬ終了はfinally文ブロック内のreturnによって生じる.簡単に言えば、プログラムは(try)trueを返すことを試みたが、最終的に(finally)falseを返す.
各finally文ブロックは、チェックされていない例外が投げ出されない限り、正常に終了する必要があります.finally文ブロックを終了するには、return、break、continue、またはthrowを使用しないでください.チェックされた例外をfinally文ブロックの外に伝播することを許可しないでください.
以上の解析によればoutput 1の出力は容易に理解できる.しかしoutput 2は上記の分析の逆の例を与えた.
try文ブロックの実行が正常に終了しても、意外に終了しても、finally文ブロックは実行されます.しかしoutput 2プログラムでは、try文ブロックは実行プロセスを終了しない.System.exitメソッドは、現在のスレッドと他のすべてのその場で死亡したスレッドを停止します.finally句の出現は,スレッドが実行を継続する特別な権限を与えることはできない.
システムをexitが呼び出されると、仮想マシンは閉じる前に2つのクリーンアップを実行します.まず、すべてのフックを閉じる操作を実行し、これらのフックはRuntimeに登録されています.addShutdownHookにあります.これはVM以外のリソースの解放に役立ちます.VMが終了する前に発生しなければならない動作にフックを閉じる必要があります.VMはSystemで実行する.exitが呼び出されたときに実行される2番目のクリーンアップタスクは、ターミナルに関連しています.
とにかくシステムexitは直ちにすべてのプログラムスレッドを停止し、finally文ブロックを呼び出すことはありませんが、VMを停止する前にフックを閉じる操作を実行します.VMがシャットダウンされる場合は、シャットダウンフックを使用して外部リソースを終了します.システムを呼び出す.haltは、フックを閉じることなくVMを停止することができるが、この方法はあまり使用されない.
    
注:本「java解惑」シリーズは、ブロガーが「java解惑」の原書を読んだ後、原書の説明と例の部分を改編し、博文として発表したものです.すべての例はgithubで直接テストに合格し、共有されています.これらの例を通じて自分を励まして他人に恩恵を与える.また、このシリーズのすべてのブログは、ブロガー個人の微信公衆番号で「愛題猿」や「ape_it」を検索して読むことができます.もし文章の中に原作者の権利を侵害する内容があれば、直ちにブロガーに知らせて、直ちに削除してください.もし読者が文章の中の内容に異議があれば、ブログの伝言や微信の公衆番号の伝言などの方法で共同で検討することを歓迎します.
ソースアドレスhttps://github.com/rocwinger/java-disabuse
本文は“winger”のブログから出て、転載をお断りします!