ВЫПУСК java.lang.IllegalStateException: файл zip закрыт - PullRequest
1 голос
/ 08 сентября 2010

Я создал 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 (неизвестный источник) на java.util.jar.JarFile.getJarEntry (неизвестный источник) на sun.misc.URLClassPath $ JarLoader.getResource (неизвестный источник) на солнце.misc.URLClassPath.getResource (неизвестный источник) на java.net.URLClassLoader $ 1.run (неизвестный источник) на java.security.AccessController.doPrivileged (собственный метод) на java.net.URLClassLoader.findClass (неизвестный источник) на java.lang.ClassLoader.loadClass (неизвестный источник) в java.lang.ClassLoader.loadClass (неизвестный источник) в java.lang.Class.forName0 (собственный метод) в java.lang.Class.forName (неизвестный источник) в atmguis.atm.jButton20ActionPerformed(atm.java:588) в atmguis.atm.access $ 1600 (atm.java:25) в atmguis.atm $ 17.actionPerformed (atm.java:226) в javax.swing.AbstractButton.fireActionPerformed (Неизвестный источник) в javax.swing.AbstractButton $ Handler.actionPerformed (Неизвестный источник) в javax.swing.DefaultButtonModel.fireActionPerformed (Неизвестный источник) в javax.swing.DefaultButtonModel.setPressed (Неизвестный источник) в javax.swing.plaf.basic.Baser.m) в java.awt.Component.processMouseEvent (неизвестный источник) в javax.swing.JComponent.processMouseEvent (неизвестный источник) в java.awt.Component.processEvent (неизвестный источник) в java.awt.Container.processEvent (неизвестный источник) вjava.awt.Component.dispatchEventImpl (неизвестный источник) в java.awt.Container.dispatchEventImpl (неизвестный источник) в java.awt.Component.dispatchEvent (неизвестный источник) в java.awt.LightweightDispatcher.retargetMouseEvent.awt.LightweightDispatcher.processMouseEvent (неизвестный источник) по адресу java.awt.LightweightDispatcher.dispatchEvent (Неизвестный источник) в java.awt.Container.dispatchEventImpl (Неизвестный источник) в java.awt.Window.dispatchEventImpl (Неизвестный источник) в java.awt.Component.dispatchEvent (Неизвестный источник) в java.awt.EventQp.Неизвестный источник) в java.awt.EventDispatchThread.pumpOneEventForFilters (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForFilter (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy (Неизвестный источник.Прив.) в java.awt.EventDispatchThread.pumpEvents (неизвестный источник) в java.awt.EventDispatchThread.run (неизвестный источник)

1 Ответ

3 голосов
/ 08 сентября 2010

Метод вызывается из потока обработки событий. Я уверен, что это часть проблемы. Вы пытаетесь получить доступ к файлу JAR, содержащему класс com.mysql.jdbc.Driver из этого потока. Это где ошибка выбрасывается. Я должен задаться вопросом, есть ли здесь какая-то проблема параллелизма? Вот несколько общих замечаний, которые следует учитывать. После того, как вы решите эти проблемы, посмотрите, не возникла ли у вас проблема.

  1. Вы не должны выполнять запрос к базе данных изнутри EDT. Вы должны собрать необходимую информацию из компонентов Swing, а затем использовать объект Runnable для выполнения запроса SQL в другом потоке. Выполните поиск в SO для выполнения кода в EDT или вне его, чтобы найти примеры того, как это сделать. Это гарантирует, что ваш пользовательский интерфейс не заблокируется, пока вы ждете результатов SQL.

  2. Открытие и закрытие соединения с базой данных каждый раз, когда вам нужно, лучше оставить драйверу SQL и его встроенным возможностям пула соединений. Этот метод должен быть объявлен на каком-то объекте контроллера, который уже имеет ссылку на соединение SQL. Затем, когда вызывается этот метод, вы вызываете ваш поток, как на последнем шаге, и этот поток использует ссылку на соединение SQL, которое у него уже есть.

Это возьмет строку, которая выдает исключение, и переместит его из EDT в какую-то фазу установки, предположительно, где вам больше повезет с доступом к файлу класса. Конечно, это будет намного более контролируемая среда, чем в EDT. Если проблема с доступом к нему не устранена, отладку будет проще выполнить в более контролируемой среде.

В качестве дополнительного бонуса вы также будете разрабатывать свое приложение более надежным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...