Why month in Java Date/Calendar is zero-based

以前從來沒有懷疑過為什麼 Java API 裡 java.util.Datejava.util.Calendar 的月份會是 zero-based. 以下這些資料給了答案: 因為當初, 所以現在…

這或許不是什麼太大的問題 (雖然這是個不該犯的錯), 反正只要記住月份跟別人不一樣, “規定" 是 zero-based 就好了… 直到自己想要開發一些跟日期時間有關的 library 時, 我遇到了與 JavaSoft 當初由 Date 提出 Calendar 時一樣的掙札 – 我的 API 要採 zero-based 或 one-based?

如果我採用 one-based, 就代表別人不能再用 Calendar 的常數來使用我的 API. 沒辦法, 只好跟著錯下去, 因此最後我還是決定一起淌這個混水, 採用 zero-based

這真是太可怕了, 不得不警惕自己在規劃 API 時一定要很謹慎, 因為 API 這種東西一旦對 caller 承諾了, 就難以收回… 真是一言既出、駟馬難追!!

別小看圖檔格式!!

之前使用者上傳了一支由 Adobe Photoshop CS 所製作的 JPEG 檔, 透過 Servlet 輸出時, 結果無法正常地顯示在瀏覽器裡 (在 IE 裡會得到一個叉叉, 在 Firefox 下則會明確丟出 “… cannot be displayed, because it contains errors" 的錯誤訊息), 甚至引發了 Tomcat 上 “java.lang.IllegalStateException: getOutputStream() has already been called for this response" 的錯誤.

起初以為是程式寫法上的問題, 因為有許多人提到這個錯誤是 Tomcat 5 的問題, 經過了一番折騰之後, 問題竟是出在圖檔格式…

分析圖檔之後, 發現它的格式是 “JPEG Bitmap (JPG) YCbCrk", 跟我們一般在網路上看到的 “JPEG Bitmap (JPG) YCbCr" 不同. 從不知道 JPEG 檔還有 color space 的差別

這裡有提到 YCbCrK is a JPEG-based format that has been developed by Adobe, 不知道是不是從 Adobe 產品另存出來的 JPEG 檔都有這個問題, 那麼這個問題就有些嚴重了, 因為太多人以為只有 Photoshop 才能編修圖像 (殺雞焉用牛刀?), 我要怎麼跟使用者去解釋這些東西呢?

問題是解決了, 但我還是很納悶, 為什麼圖檔格式上的錯誤, 會引發伺服器後端的錯誤?