2016-12-04 10 views
-1

Когда я пытаюсь подключиться к соке, нажав кнопку connect AGAIN после того, как я отключился с моей кнопкой постоянного тока, он всегда вызывает исключение IllegalThreadStateException. У меня есть метод для подключения к сокету и записи некоторых сообщений на него, а также Thread для чтения сообщений, которые я получаю из сокета. Я не могу найти проблему, потому что, на мой взгляд, все должно работать, как я хочу, чтобы она работала.Невозможно найти ошибку, которая вызывает ошибку IllegalThreadStateException

Мой Connect Метод:

public void Connect() throws IOException{ 

    this.BotName = jTextField1.getText(); 
    this.AuthKey = jTextField2.getText(); 
    this.Channelname = jTextField3.getText(); 

    this.jTextArea1.append("Starting Connection To: " + Server + "\n"); 

     try{  

     socket = new Socket(Server, Port); 

     connected = socket.isConnected() && !socket.isClosed(); 

     out = new OutputStreamWriter(socket.getOutputStream()); 
     isr = socket.getInputStream(); 
     in = new BufferedReader(new InputStreamReader(isr)); 

     if (!this.ReadServerMessages.isAlive()){    
      ReadServerMessages.start();   
     } 

     out.write("PASS " + this.AuthKey + "\r\n"); 
     out.write("NICK " + this.BotName + "\r\n"); 
     out.write("USER " + this.BotName + " 8 " + this.BotName + "\r\n"); 
     out.write("CAP REQ :twitch.tv/membership \r\n"); 
     out.write("CAP REQ :twitch.tv/commands \r\n"); 
     out.write("CAP REQ :twitch.tv/tags \r\n"); 
     out.write("JOIN #" + this.Channelname + "\r\n"); 
     out.flush(); 

     if(connected = true){ 

      this.jButton1.setEnabled(false); 
      this.jTextArea1.append("Successfully Connected!\n"); 
      this.jButton3.setEnabled(true); 
      this.jLabel15.setText("YES"); 
      this.jLabel15.setForeground(Color.green); 

     } 

     }catch(Exception e){ 

      e.printStackTrace(); 

     }  

    } 

Мой ReadMessages Тема:

Thread ReadServerMessages = new Thread(new Runnable() { 

    public void run() { 

     try { 

      while((ServerMsg != null) && (connected = true)){ 

      ServerMsg = in.readLine(); 

      jTextArea3.append(ServerMsg + "\n"); 

      PingCheck(); 
      getViewerMsg(); 

      CheckCommand(); 

      } 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } catch (SQLException exe) { 
      exe.printStackTrace(); 
     } 

    } 

}); 

Полное исключение я получаю:

java.lang.IllegalThreadStateException 
at java.lang.Thread.start(Thread.java:705) 
at main.TwitchBotFenster.Connect(TwitchBotFenster.java:98) 
at main.TwitchBotFenster.jButton1ActionPerformed(TwitchBotFenster.java:1420) 
at main.TwitchBotFenster.access$100(TwitchBotFenster.java:25) 
at main.TwitchBotFenster$2.actionPerformed(TwitchBotFenster.java:599) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6535) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6300) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4891) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4713) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2750) 
at java.awt.Component.dispatchEvent(Component.java:4713) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
+3

Вы не можете перезапустить поток. 'if (connected = true)' должен, скорее всего, быть 'if (connected)', и вы должны изучить его соглашения об именах Java и придерживаться их. Переменные и методы начинаются с строчной буквы. –

+0

Спасибо за совет :)! Я не пытаюсь перезапустить его. Он должен просто читать входящие сообщения. Вот почему я подумал, что должен использовать 'if (! This.ReadServerMessages.isAlive())', потому что он будет выполнен только один раз. Но я все еще получаю это исключение. @JBNizet – TomiG

+1

У нас недостаточно кода для объяснения. Но вы бы не получили это исключение, вы впервые вызвали start() в потоке. Поэтому вы пытаетесь перезапустить его. –

ответ

0

Существует только одна ошибка, которая вызывает это исключение: попытка для запуска потока, который уже завершен.

NB:

connected = socket.isConnected() && !socket.isClosed(); 

isConnected() верно и isClosed() ложна в точке вы evaulating это утверждение. Это бессмысленно. И ни один из этих методов не может быть использован, чтобы рассказать вам о состоянии соединения на любом последующем этапе. Они должны сообщить вам состояние Socket.

if (connected = true) 

Это задание, а не сравнение. Это должно быть if (connected), но см. Выше.

Смежные вопросы