Showing all posts tagged #java:


struts1 中 DispatchAction 繼承 execute 執行順序

Posted on February 16th, 2017

地雷時間: 8小時(一個工作天) :(((

假設

StoreManageBaseAction extends DispatchAction


StoreManageIndexAction extends StoreManageBaseAction

當 execute 被執行時,
會優先執行父類別的 execute(), 才執行子類別指定的 method


例如:
要執行 StoreManageIndexAction.index(),
會先執行完 StoreManageBaseAction.execute() 才執行 StoreManageIndexAction.index()



OutOfMemoryError Occurs when allocate a big Byte Array

Posted on February 6th, 2015

今天遇到另一個 Java 的地雷,

而且一個非常簡單的一個程式碼就會吐出 OOM 錯誤:

java.lang.OutOfMemoryError: Java heap space

int fileLength = 170 * 1024 * 1024;
byte[] b2 = new byte[fileLength];

Array 不能且不應該產生這麼長的 instance, 因為會超過 java 的 default heap size.

當然可以去改 jvm 參數將 heap size 加大,
但這並不是一個長遠之計,
改天再遇到更大的檔案一樣會 OOM

這次因為想要打亂檔案的 header ,
所以求快直接使用這種方法比較簡單... 囧

參考資料:

修改方法

  • 修改前
    byte[] b2 = new byte[b.length]; for (int i = 0; i < b.length; i++) { b2[i] = (byte) (b[i] + k); } return b2;
  • 修改後(利用 buffer 來改)
abc

Implements equals() for non-primitive types

Posted on January 21st, 2015

這次遇到一個簡單到不行的 Java 小地雷,

實作物件的 equals() 時, 若要比對 non-primitive typeInteger, Long, Double 等物件數值,

請記得使用 equals() 不要用 == ,

或者自己將 Integer.intValue()Long.longValue() 拿出來再用 ==

不然 boolean eq = new Integer(1) == new Integer(1) 會永遠給你 false,

除非夠幸運兩個 Object 發生 conflict XD

這是 Integer.equals(obj) 的實作, 也就是為什麼 equals(obj) 才會正確的原因
private final int value; public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }

參考資料

另外參考了 stackoverflow Compare non-primitive Long values 127 and 128 後, 發現 -128127 之間的數值 jvm 會先 cache 起來 ,

如下程式碼:

        Long a = Long .valueOf(127);
        Long b = Long .valueOf(127);
        boolean eq = a == b; // 是 true
        Long a = Long .valueOf(128);
        Long b = Long .valueOf(128);
        boolean eq = a == b; // 是 false

        boolean eq = new Long(1) == new Long(1); // 但這一樣永遠是 false !

小結論:

  1. == 去比較 new Long(long) 的數值都不會相等,
  2. == 去比較 Long.valueOf(long) 的數值只有在 -128 到 127 之間會相等
  3. 所以若要比較 non-primitive type (ex: Integer, Long, Double) 的數值, 請用 equals(obj)

Tomcat + ImageIO: Can't create cache file!

Posted on February 27th, 2014

需求是想透過 pdfbox 將上傳的 pdf 文件中的圖片擷取出來, 以作為預覽縮圖使用,
當在 main 裡試過可以後, 就嘗試把程式搬到 Struts 上, 沒想到就丟出這個 Exception

> **Can't create cache file!**
> javax.imageio.IIOException: Can't create cache file!
> at javax.imageio.ImageIO.createImageInputStream(ImageIO.java:361)
> at javax.imageio.ImageIO.read(ImageIO.java:1351)

原來是當 `ImageIO` 在 Tomcat 上使用時,
程式會預設使用 ` $CATALINA_BASE/temp` 作為轉檔用的 Cache
所以要確認該資料夾存在, 且可以存取,
若沒有就會丟出上述 IIOException

####Ref:
[http://codeforfun.wordpress.com/2008/04/28/iioexception-cant-create-cache-file/](http://codeforfun.wordpress.com/2008/04/28/iioexception-cant-create-cache-file/)

Liu@llen

Notes from my experience.