gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:44 25 4
gpt4 key购买 nike

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

最佳答案

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

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

关于java - 当程序从另一个目录运行时 DriverManager.getConnection 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com