Java Puzzlers: 38.The Unwelcome Guest
下面這段程式碼有沒有問題呢? public class UnwelcomeGuest { public static final long GUEST_USER_ID = -1; private static final long USER_ID; static { try { USER_ID = getUserIdFromEnvironment(); } catch (IdUnavailableException e) { USER_ID = GUEST_USER_ID; System.out.println("Logging in as guest"); } } private static long getUserIdFromEnvironment() throws IdUnavailableException { throws new IdUnavailableException (); } public static void main(String[] args) { System.out.println("User ID: " + USER_ID); } } class IdUnavailableException extends Exception { IdUnavailableException() { } } 結果:這隻程式看似正常,實際上卻無法編譯! 這是因為要利用電腦來要判斷blank final是否在程式中被設定超過一次是極為困難的, Java編譯器使用的規則是『blank final只有在"當然"未被設定時,才能被設定』。 問題就是只能歸咎於,編譯器的演算法還不夠完善, Java為了安全起見,要求我們必須修改這個不夠安全的程式碼。