ISSUE java.lang.IllegalStateException:zip文件已关闭

时间:2010-09-08 14:02:12

标签: java swing jar

我创建了一个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文件已关闭
  在java.util.zip.ZipFile.ensureOpen(未知来源)
  在java.util.zip.ZipFile.getEntry(未知来源)
          在java.util.jar.JarFile.getEntry(未知来源)           at java.util.jar.JarFile.getJarEntry(Unknown Source)           at sun.misc.URLClassPath $ JarLoader.getResource(Unknown Source)           at sun.misc.URLClassPath.getResource(Unknown Source)           在java.net.URLClassLoader $ 1.run(未知来源)           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)           在atmguis.atm.jButton20ActionPerformed(atm.java:588)           在atmguis.atm.access $ 1600(atm.java:25)           在atmguis.atm $ 17.actionPerformed(atm.java:226)           在javax.swing.AbstractButton.fireActionPerformed(未知来源)           at javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)           在javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)           在javax.swing.DefaultButtonModel.setPressed(未知来源)           在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知来源)           at java.awt.Component.processMouseEvent(Unknown Source)           在javax.swing.JComponent.processMouseEvent(未知来源)           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)           在java.awt.EventDispatchThread.run(未知来源)

1 个答案:

答案 0 :(得分:3)

从Event Dispatch Thread调用所涉及的方法。我确信这是问题的一部分。您正尝试从此线程访问包含com.mysql.jdbc.Driver类的JAR文件。这是抛出错误的地方。我不得不怀疑这里是否存在某种并发问题。以下是一些应该解决的一般性说明。一旦解决了这些问题,请查看您是否仍有问题。

  1. 您不应该在EDT内部进行数据库查询。您应该从swing组件中收集所需的信息,然后使用Runnable对象在不同的​​线程上执行SQL查询。在SO上搜索以在EDT上或从EDT执行代码以查找如何执行此操作的示例。这将确保您在等待SQL结果时不会锁定UI。

  2. 每次需要打开和关闭数据库连接时,最好留给SQL驱动程序及其内置的连接池功能。应该在某种已经具有SQL连接引用的控制器对象上声明此方法。然后,当调用此方法时,就像在最后一步中一样调用线程,该线程使用对已有的SQL连接的引用。

  3. 这将占用抛出异常的行并将其从EDT移出到某种设置阶段,大概是你可以更好地访问类文件。当然,这将是一个比EDT更受控制的环境。如果访问它仍然存在问题,那么在更受控制的环境中调试会更容易。

    作为额外的奖励,您还将以更加强大的方式设计您的应用程序。