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為了安全起見,要求我們必須修改這個不夠安全的程式碼。

留言