Android: 僅真機除錯時出現的JDBC錯誤:java.lang.UnsupportedOperationException
背景
這是寒假裡剛開始學習Android遇到的問題,困擾了我三天的時間,期間痛苦無比,心情一波三折,包括百度無果後的沮喪,Google發現StackOverFlow上有一個小兄弟遇到跟我完全一致問題的期待,再到注意到問題0 answer後的絕望。最後碰巧解決問題後興奮地幾欲奔走……大概這就是人生吧!
問題描述
報錯內容:
01-21 22:53:48.713 5823-5946/com.stellaris.practice E/AndroidRuntime: FATAL EXCEPTION: Thread-5 Process: com.stellaris.practice, PID: 5823 java.lang.UnsupportedOperationException at java.util.regex.Matcher.group(Matcher.java:383) at com.mysql.cj.conf.ConnectionUrlParser.isConnectionStringSupported(ConnectionUrlParser.java:152) at com.mysql.cj.conf.ConnectionUrl.acceptsUrl(ConnectionUrl.java:258) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:195) at java.sql.DriverManager.getConnection(DriverManager.java:569) at java.sql.DriverManager.getConnection(DriverManager.java:219) at com.stellaris.functions.DBUtils.getConnection(DBUtils.java:21) at com.stellaris.functions.DBUtils.getUserInfoByName(DBUtils.java:33) at com.stellaris.practice.LoginActivity$2.run(LoginActivity.java:91) at java.lang.Thread.run(Thread.java:760)
報錯程式碼
try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://XXX.XX.XXX.XXX:3306/androidapp","XXX", "XXXXX"); }
也就是通過JDBC直接連線開放埠的伺服器時報的錯,然而奇詭的是,在PC端寫測試程式碼可以執行 。
import java.sql.DriverManager; public class test { private static String ip = "XXX.XXX.XXX.XXX"; private static String dbname = "XXX"; private static String url = "jdbc:mysql://" + ip + "/"+ dbname ; private static String driver = "com.mysql.cj.jdbc.Driver"; private static String username = "XXX"; private static String password = "XXXXXX"; public static void main(String[] args) throws Exception { Class.forName(driver).newInstance(); System.out.println(DriverManager.getConnection(url, username, password)); } }
這段程式碼是可以直接輸出伺服器返回的值的。追蹤報錯的程式碼,由於水平有限也毫無成果,期間Debug過程也毫無頭緒,最終碰巧解決了,那麼廢話不多說。
解決辦法
正常debug毫無頭緒,我就打算降低jdbc版本,最終經過幾次版本的嘗試,把原先依賴的
mysql-connector-java-8.0.12.jar
上maven下載了低版本,替換成了
mysql-connector-java-5.1.47.jar
問題就神奇的解決了……
事後回想起來,伺服器的mysql是購置騰訊雲的時候自帶的,應該也是5.x版本,高版本的mysql-jdbc很可能有相容問題……主要是在PC端測試沒有問題沒讓我往版本那塊兒想。總之經驗就是解決依賴問題,版本也是一個重要的因素。
這個問題在百度上從沒見過,也貢獻了我在StackOverFlow的首答,其實我很想問問那個跟我提了一樣問題的小兄弟是怎麼解決的。總之希望能幫助同樣被這個問題困擾的同學(應該沒有)。