發表文章

目前顯示的是 2月, 2008的文章

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

Java筆記:SimpleDateFormat的ParseException

圖片
緣由 我有一個「Jul 11 2006」格式的時間字串,想要將它parse進程式中。 從Java Doc中我找到能夠輕易達到功能的方法,就是利用 SimpleDateFormat 來 parse這個字串,然而它卻產生了ParseException,顯然就是不接受我所餵給他的pasre的字串。 程式碼 import java.text.*; import java.util.*; class test {  public static void main(String[] args) {   String date = "Jul 11 2006";   try {    SimpleDateFormat source =     new SimpleDateFormat("MMM dd yyyy");    System.out.println(source.parse(date));   } catch (Exception e) {    e.printStackTrace();   }  } } 在文件中的Date and Time Patterns段落,有寫道使用M是可以parse月份的,且支援 July 、 Jul 、 07三種格式,只是若我們寫1或2個M,就只會當作數字格式,3個以上(含)M之後才會用其他的格式來parse,而程式碼也沒有錯,究竟是怎麼一回事? 在我反覆測試後,我決定再看看Java Doc,撇見含有Locale的建構子,就想到Java Puzzlers,雖然我從來沒有重視過Locale的問題,但是這次就該是Locale的問題,果不其然,設定為英語系後果然就正常運行了(汗) 修正後程式碼 import java.text.*; import java.util.*; class test {   public static void main(String[] args) {   String date = "Jul 11 2006";   try {    SimpleDateFormat source =     new SimpleDateFormat("MMM dd yyyy", Locale.ENGLISH );    System.out.p...

Java小程式:JarImageFetcher

之前使用Eclipse幫高中同學改一隻他們要交的小遊戲時,就覺得很狐疑,為甚麼用class跑就可讀曲到圖片,將它們包成jar檔案就不能用,我明明是用與以前放在jar裡可以跑的程式碼呀? 後來才發現,原來是我沒有把Java-doc看完,在 ClassLoader的getResource 方法中寫了一段註記 The name of a resource is a ' / '-separated path name that identifies the resource. 譯:資源的名稱是以'/'(正斜線)作為區分的的路徑名稱。 在windows上,若不以正斜線作分隔,直接執行class檔,是可以抓到所需的資源;但是,若將所有的資源都包成Jar後,就會抓不到所需的資源了。這也是造成我程式問題,若沒有細看這些註記,實在很難發現問題點。 觀看JarImageFetcher的 完整原始碼。