线程错误:JAVA

线程错误:JAVA,java,netbeans,netbeans-8,Java,Netbeans,Netbeans 8,我运行下面的应用程序(附加代码),然后单击jToggle按钮启动编码功能(音频捕获),它成功地工作了。再次单击jToggleButton停止该功能(音频捕获)后,该功能停止。但是在第二次单击之后,Netbeans输出终端显示一些错误。所以,我试图找出问题所在,但仍然无法确定代码出了什么问题。我希望,我可以从这里得到帮助,我只是一个Java初学者。因此,如果你能帮助我修改这段代码,这将更有助于我理解清楚 错误日志: 申请总代码 无论切换状态如何,都可以启动新线程。只有在切换到“开”时,才应该这样做

我运行下面的应用程序(附加代码),然后单击
jToggle按钮
启动编码功能(音频捕获),它成功地工作了。再次单击
jToggleButton
停止该功能(音频捕获)后,该功能停止。但是在第二次单击之后,Netbeans输出终端显示一些错误。所以,我试图找出问题所在,但仍然无法确定代码出了什么问题。我希望,我可以从这里得到帮助,我只是一个Java初学者。因此,如果你能帮助我修改这段代码,这将更有助于我理解清楚

错误日志:

申请总代码


无论切换状态如何,都可以启动新线程。只有在切换到“开”时,才应该这样做。否则,新线程将尝试打开麦克风的I/O,这可能是不可能的,因为第一个线程仍在使用它


线程t=…
do
if(!jToggleButton1.isSelected())返回之前

哪一个是第83行?@Fildor,tnx,请注意。第83行是这样的:mirror.open(格式);刚看到:每个切换,你开始一个新的线程。。。不好的!只有当切换到“开”时,您才会想要启动一个新的。如果您检查此项,它可能已经解决了问题。@Fildor,我如何修复它。。?好的解决办法是什么。。?你能帮我修改代码吗?这对我理解清楚会更有帮助。因为,我只是一个Java初学者我猜会出现异常,因为您的麦克风已经在使用中(通过第一次单击开始的线程)。
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes/frame, big-endian not supported.
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:153)
at javaapplication1.NewJFrame1$2.run(NewJFrame1.java:83)
at java.lang.Thread.run(Thread.java:745)
package javaapplication1;

import java.io.ByteArrayOutputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;


public class NewJFrame1 extends javax.swing.JFrame {


public NewJFrame1() {
    initComponents();
}


@SuppressWarnings("unchecked")

private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jToggleButton1 = new javax.swing.JToggleButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

    jToggleButton1.setText("jToggleButton1");
    jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jToggleButton1ActionPerformed(evt);
        }
    });

    jPanel1.add(jToggleButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 70, -1, -1));

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );

    pack();
}                  

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               

 Thread t = new Thread(new Runnable()  
 {                                     
    @Override                          
    public void run()                  
    {                                  

AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true);
{TargetDataLine microphone;
SourceDataLine speakers;

try {
    microphone = AudioSystem.getTargetDataLine(format);

    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
    microphone = (TargetDataLine) AudioSystem.getLine(info);
    microphone.open(format);

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int numBytesRead;
    int CHUNK_SIZE = 1024;
    byte[] data = new byte[microphone.getBufferSize() / 5];
    microphone.start();


    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
    speakers = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
    speakers.open(format);
    speakers.start();

    while(jToggleButton1.isSelected()){
        numBytesRead = microphone.read(data, 0, CHUNK_SIZE);
        speakers.write(data, 0, numBytesRead);

    }
    speakers.drain();
    speakers.close();
    microphone.close();

    } catch (LineUnavailableException e) {
        e.printStackTrace();
    }

      }
    }

 });

t.start();    
  }         
}                                              


public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }



    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame1().setVisible(true);
        }
    });
}

// Variables declaration                  
private javax.swing.JPanel jPanel1;
private javax.swing.JToggleButton jToggleButton1;

}