我创建了一个抛出以下错误的 jar 文件,这是一个简单的 swing 应用程序,当我按下按钮时它会插入一行,不确定我哪里出错了,请指教。
private void jButton20ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
setatmid(jTextField2.getText());
setaa10(Integer.parseInt(jTextField3.getText()));
setaa20(Integer.parseInt(jTextField4.getText()));
setaa50(Integer.parseInt(jTextField5.getText()));
setaa100(Integer.parseInt(jTextField6.getText()));
try{
System.err.println("Inserting values in Mysql database table!");
Connection con = null;
String url = "jdbc:mysql://localhost:3306/";
String db = "agents";
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
con = DriverManager.getConnection(url+db,"root","");
Statement st = con.createStatement();
String query="INSERT INTO schedule_data (`s_ID`, `schedule_date`, `atmID`, `notification`) VALUES ('"+System.currentTimeMillis()+"','2010-09-15','"+getatmid()+"','null')";
st.executeUpdate(query);
System.err.println("1 row affected");
} catch(Exception e) {
e.printStackTrace();
}
}
错误:
java.lang.IllegalStateException: zip file closed
at java.util.zip.ZipFile.ensureOpen(Unknown Source)
at java.util.zip.ZipFile.getEntry(Unknown Source)
at java.util.jar.JarFile.getEntry(Unknown Source) at java.util.jar.JarFile.getJarEntry(Unknown Source) at sun.misc.URLClassPath$JarLoader.getResource(Unknown Source) at sun.misc.URLClassPath.getResource(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at atmguis.atm.jButton20ActionPerformed(atm.java:588) at atmguis.atm.access$1600(atm.java:25) at atmguis.atm$17.actionPerformed(atm.java:226) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
最佳答案
所涉及的方法是从事件调度线程调用的。我确定这是问题的一部分。您正在尝试从此线程访问包含 com.mysql.jdbc.Driver
类的 JAR 文件。这是抛出错误的地方。我想知道这里是否存在某种并发问题。这里有一些一般性的注意事项,应该解决的问题。解决这些问题后,看看您是否还有问题。
您不应该从 EDT 内部进行数据库查询。您应该从 swing 组件收集所需的信息,然后使用
Runnable
对象在不同的线程上执行 SQL 查询。在 SO 上搜索在 EDT 上或下执行代码以查找如何执行此操作的示例。这将确保您的 UI 在您等待 SQL 结果时不会锁定。每次需要时打开和关闭数据库连接最好留给 SQL 驱动程序及其内置的连接池功能。该方法应该在某种已经具有对 SQL 连接的引用的 Controller 对象上声明。然后,当调用此方法时,您将像上一步一样调用您的线程,该线程将使用对它已有的 SQL 连接的引用。
这将采用抛出异常的行并将其从 EDT 移到某种设置阶段,大概在这个阶段您可以更幸运地访问类文件。当然,这将是一个比 EDT 内更受控制的环境。如果访问它仍然存在问题,则在更受控的环境中进行调试会更容易。
作为额外的好处,您还将以更健壮的方式设计您的应用程序。
关于java - 问题 java.lang.IllegalStateException : zip file closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3668483/