前幾天想到,
如果把工作這幾年遇到的Java exception都記錄下來,
應該滿可觀的。
反正寫程式不可能不遇到exception,
既然想到了,那就從今天開始做吧!
java.sql.SQLException: 無效的資料欄索引
java.sql.SQLException: Invalid column index
表示 sql 字串的欄位和問號個數不一致
例如 insert into table (columnA, columnB, columnC) values (?, ?)
有 3 個欄位,但只有 2 個問號,就會出現 java.sql.SQLException: 無效的資料欄索引
net.sf.json.JSONObject Property 'charAt' of class java.lang.StringBuffer has no read method. SKIPPED
net.sf.json.JSONObject Property 'length' of class java.lang.StringBuffer has no read method. SKIPPED
這表示有人試圖把 StringBuffer 放到 JSONObject 裡。
例如
JSONObject jobj = new JSONObject();
StringBuffer sb = new StringBuffer();
jobj.put("key", sb); // 只要改成 sb.toString()就不出現上述提醒了
java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
oracle.net.ns.NetException: Got minus one from a read call
通常表示 DB 有設白名單,但你的 Java 程式所在主機不在 DB 白名單中。
所以請找 DBA 把你的主機加到白名單中吧!
溫馨提醒:找 DBA 前請先確定你的 JDBC URL 沒有打錯,以免被 DBA 譙 XD
java.sql.SQLException: ORA-01000: maximum open cursors exceeded
這個問題的原因要看你有沒有用 connection pool 來找。
如果你沒有用 connection pool,那很可能是沒有關閉connection 造成。
如果你有用 connection pool,那就算關閉 connection,也還是有可能發生一樣的問題。
因為關閉從 pool 裡拿到的 connection,只是意味著把 connection 歸還 pool。與connection 有關的資源如果沒有被關閉,就仍然存在。
所以如果是用 connection pool,務必記得關閉 statement 或 prepared statement 等等物件,最後再關閉 connection。
javax.crypto.BadPaddingException: Given final block not properly padded
目前只有暫時解法。
使用 AES 解密時遇到這個問題的原因可能是密碼不對。
但如果你確定密碼都對,而且在 Windows 沒問題,在 Linux 才有 exception,那
可能就是 SecureRandom 造成的。
通常我們可能在加密和解密時都用
keyGen.init(256, new SecureRandom("password".getBytes(“UTF-8”)));
來初始化 Key Generator,但這樣的做法在 Window 沒問題,在 Linux 就有可能出錯了。
因為 Windows 每次產生的 key 都相同,但 Linux 則會不一樣。所以在 Linux 解密時就會因為 key 不同的關係,導致出現 exception。
畢竟加密和解密是用不同的 key,當然不能解密。
Google之後看到不少人的解決方案都是強迫讓 Linux 的 key 也變得每次都一樣,如下:
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed("password".getBytes("UTF-8"));
keyGen.init(256, secureRandom);
只是我覺得這種寫法似乎不太安全,因為每次產生的key都不同,理論上比較保險。如果能提點請留言告知。
-------------------
本文會持續更新。
留言列表