当程序从另一个目录运行时,DriverManager.getConnection不起作用

时间:2014-09-28 11:59:12

标签: java linux sqlite

我有一个使用sqlite数据库的字典应用程序。当我在终端上运行应用程序时 使用此命令java -jar RememberDict.jar存在jar文件的路径它可以工作,但是当我从应用程序所在的位置以外的地方运行它时,它会给我错误,我相信它来自这段代码:

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文件所在的同一文件夹中的raw文件夹中。实际上我想从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文件存在的位置运行应用程序,尽管找不到该文件,但以前的代码可以加载数据库文件。

1 个答案:

答案 0 :(得分:-1)

System.getProperty("user.dir")将返回运行程序的目录,而不是主文件夹。

所以在这种情况下,sqlite文件应该始终与java程序所在的文件夹相同。