.getCause() – 「原因」という玉葱の皮を剥く【Java】

EngineeringJava, 備忘録, 試験

.getCause() – 「原因」という玉葱の皮を剥く【Java】

インプレス社黒本186ページ

 

・例外伝播サンプル 最初のtryブロック 5、6、7行

	public static void main(String[] args) {
		// long start = System.currentTimeMillis();  //時間計測 オリジナル追記
		try {
			x();
		} catch (Throwable e) {
			while (e != null) {
				//e = e.getCause();
				System.out.println(e.getMessage());
				e = e.getCause();
			}
		}
		// System.out.println();  //時間計測 オリジナル追記
		// long end = System.currentTimeMillis();
		// System.out.println("Time : _" + (end - start) + " millis");
	}

	static void x() throws Exception {
		try {
			y();
		} catch (Exception e) {
			throw new Exception("exception in x()", e);
		}
	}
	
	static void y() throws Exception {
		try {
			z();
		} catch (Exception e) {
			throw new Exception("exception in y()", e);
		}
	}
	
	static void z() throws Exception {
			throw new Exception("exception in z()");
	}

=> exception in x() 改行 exception in y() 改行 exception in z()

順番に綺麗に、格納されたメッセージを表示するよ。

 

ところで、下記のところで、

		} catch (Throwable e) {
			while (e != null) {
				//e = e.getCause();  //  Exception in thread "main" java.lang.NullPointerException
				System.out.println(e.getMessage());
				e = e.getCause();
			}
		}

e = e.getCause(); が System.out.println(e.getMessage()); より上にあると、Exception in thread “main” java.lang.NullPointerException になります。つまり、この順番でなければダメってことのようだ。

 

e = e.getCause(); が書かれていないと、「exception in x()」を吐き続ける無限ループになるんねん。つまり、getCause によって、数層に重なった「原因」という玉葱の皮を剥く契機を得ているという風に考えればいいのだろーか?

 

 


EngineeringJava, 備忘録, 試験

Posted by Qawai