2014-09-28 33 views
0

我有一個使用sqlite數據庫的字典應用程序。當我運行應用程序在終端從 路徑,該文件存在與此命令java -jar RememberDict.jarjava -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文件存在的位置。

+0

讓我問你爲什麼拋出catch子句中的異常? – 2014-09-28 12:03:47

+0

我用它有一個特定的異常消息,我知道從哪裏來'''System.out.println(「connot connect to words.db」);'這是沒有必要的。 – Akbar 2014-09-28 12:09:50

+0

那麼你寫這個代碼?或者你從其他地方複製它,你不明白它是如何工作的?該應用程序顯然是硬編碼在一個地方尋找驅動程序文件;我真的不明白你的問題是什麼。 – 2014-09-28 13:09:41

回答

-1

System.getProperty("user.dir")將返回程序運行的目錄,而不是主目錄。

所以在這種情況下,sqlite文件應該總是和你的java程序所在的文件夾一樣。

相關問題