2010-09-08 16 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的成某種設置階段,想必在這裏您將有更好的運氣訪問類文件。當然,這將是一個比美國東部時間更受控制的環境。如果在訪問它時仍然存在問題,那麼在更受控制的環境中調試將更容易。

作爲一個額外的好處,你也將以更強大的方式設計你的應用程序。