我有一個使用sqlite數據庫的字典應用程序。當我運行應用程序在終端從 路徑,該文件存在與此命令java -jar RememberDict.jar
java -jar RememberDict.jar
它的工作,但是當我從其他地方應用程序存在的地方運行它,它給了我錯誤,我相信它來自此代碼:當程序從另一個目錄運行時,DriverManager.getConnection不起作用
try {
conn = DriverManager.getConnection("jdbc:sqlite:" + System.getProperty("user.dir") + File.separator +"raw" + File.separator + "dict.db");
} catch (SQLException ex) {
System.out.println("connot connect to words.db");
throw new Exception("Cannot connect to words.db");
}
所以具體而言,當我例如運行此命令 java -jar ~/NetBeansProjects/RememberDict/dist/RememberDict.jar
它給錯誤是這樣的:
connot connect to words.db
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at database.Database.getFavWords(Database.java:122)
at rememberdict.FavoritesPanel.<init>(FavoritesPanel.java:36)
at rememberdict.GUIController.<init>(GUIController.java:62)
at rememberdict.RememberDict$1.run(RememberDict.java:11)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
編輯:
我想我找到了解決方案,我的數據庫文件(dict.db)位於jar文件所在的同一文件夾中的原始文件夾中。實際上我想從jar文件存在的地方加載數據庫文件。與以前的代碼的Java無法找到數據庫文件,這些異常拋出,過了一會兒,我想出了這個解決方案:
String separator = File.separator;
String databasePath = Database.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String currentDir = databasePath.substring(0, databasePath.lastIndexOf(separator) + 1) + "raw" + separator + "dict.db";
conn = DriverManager.getConnection("jdbc:sqlite:" + currentDir);
我覺得前面的代碼,儘管沒有找到該文件,如果我們運行可以加載數據庫文件該應用程序來自jar文件存在的位置。
讓我問你爲什麼拋出catch子句中的異常? – 2014-09-28 12:03:47
我用它有一個特定的異常消息,我知道從哪裏來'''System.out.println(「connot connect to words.db」);'這是沒有必要的。 – Akbar 2014-09-28 12:09:50
那麼你寫這個代碼?或者你從其他地方複製它,你不明白它是如何工作的?該應用程序顯然是硬編碼在一個地方尋找驅動程序文件;我真的不明白你的問題是什麼。 – 2014-09-28 13:09:41