2010-09-08 17 views
1

我创建了一个引发下面错误的jar文件,它是一个简单的swing应用程序,当我按下按钮时插入一行,不知道我错误的地方请指教。ISSUE java.lang.IllegalStateException:压缩文件关闭

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)

+1

向我们显示您的代码,但它会在您访问它之前关闭您的ZipStream。 – 2010-09-08 14:04:49

+0

在NetBeans中创建此应用程序并以爆炸形式正常工作。我已经添加了代码,请通知您 – user440798 2010-09-08 14:09:02

+0

您是否尝试更新压缩的数据库文件? – trashgod 2010-09-08 14:23:59

回答

3

参与正在从事件指派线程调用​​的方法。我相信这是问题的一部分。您正试图从此线程访问包含com.mysql.jdbc.Driver类的JAR文件。这是错误被抛出的地方。我不得不怀疑这里是否存在某种并发问题。这里有几个一般说明,应该解决的问题。一旦你解决了这些问题,看看你是否仍然有问题。

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

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

这将采取的投掷异常的行并将其移出了EDT的成某种设置阶段,想必在这里您将有更好的运气访问类文件。当然,这将是一个比美国东部时间更受控制的环境。如果在访问它时仍然存在问题,那么在更受控制的环境中调试将更容易。

作为一个额外的好处,你也将以更强大的方式设计你的应用程序。