Java 在线程中引发错误(异常)

Java 在线程中引发错误(异常),java,multithreading,exception,joptionpane,Java,Multithreading,Exception,Joptionpane,我正在开发一个简单的Java应用程序。我在抛出异常方面有问题 实际上,异常应该在线程中抛出。因此,存在以下例外情况的线程: public void setVyplata(Otec otec) { try { otec.setVyplata(Integer.parseInt(textField1.getText())); } catch (NumberFormatException e) { JOptionPane.showMessageDial

我正在开发一个简单的Java应用程序。我在抛出异常方面有问题

实际上,异常应该在线程中抛出。因此,存在以下例外情况的线程:

public void setVyplata(Otec otec) {

    try {
        otec.setVyplata(Integer.parseInt(textField1.getText()));

    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE);
        otec.setVyplata(0);
        textField1.setText("0");
    }

}

public void setVyplata(Mama mama) {

    try {
        mama.setVyplata(Integer.parseInt(textField2.getText()));

    } catch (NumberFormatException e) {

        JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE);
        mama.setVyplata(0);
        textField2.setText("0");
    }
}
有可能同时引发两个异常

当它发生时,我得到的是:


我为每个方法运行线程。我的问题是为什么程序会停止在这里工作。因为,当我分别启动其中一个线程时。它工作得很好。当我启动两个线程时,应该有两个错误窗口,但您可以看到空白的错误窗口和程序不工作。

我可以明确地告诉您,根据您之前的评论,swing组件的非线程安全特性存在问题。您应该阅读文档。您需要使用invoke方法确保将更改任务放置在事件调度线程上,否则,您的应用程序将崩溃

您的代码示例如下:

public void setVyplata(Otec otec) {

    try {
        otec.setVyplata(Integer.parseInt(textField1.getText()));

    } catch (NumberFormatException e) {

        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE);
            otec.setVyplata(0);
            textField1.setText("0");
        });

    }

}

public void setVyplata(Mama mama) {

    try {
        mama.setVyplata(Integer.parseInt(textField2.getText()));

    } catch (NumberFormatException e) {

        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE);
            mama.setVyplata(0);
            textField2.setText("0");
        });
    }
}
如果您查看SwingUtilities文档,您可以很好地解释实际执行的操作:

导致在AWT事件上异步执行doRun.run() 调度线程。这将在所有挂起的AWT事件发生后发生 已经处理过了。当应用程序线程 需要更新GUI。在下面的示例中,调用调用器调用 将可运行对象doHelloWorld在事件调度上排队 线程,然后打印一条消息


我可以明确地告诉您,根据您之前的评论,您对swing组件的非线程安全特性存在问题。您应该阅读文档。您需要使用invoke方法确保将更改任务放置在事件调度线程上,否则,您的应用程序将崩溃

您的代码示例如下:

public void setVyplata(Otec otec) {

    try {
        otec.setVyplata(Integer.parseInt(textField1.getText()));

    } catch (NumberFormatException e) {

        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE);
            otec.setVyplata(0);
            textField1.setText("0");
        });

    }

}

public void setVyplata(Mama mama) {

    try {
        mama.setVyplata(Integer.parseInt(textField2.getText()));

    } catch (NumberFormatException e) {

        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(panel, "Nemozno vlozit string", "Error", JOptionPane.ERROR_MESSAGE);
            mama.setVyplata(0);
            textField2.setText("0");
        });
    }
}
如果您查看SwingUtilities文档,您可以很好地解释实际执行的操作:

导致在AWT事件上异步执行doRun.run() 调度线程。这将在所有挂起的AWT事件发生后发生 已经处理过了。当应用程序线程 需要更新GUI。在下面的示例中,调用调用器调用 将可运行对象doHelloWorld在事件调度上排队 线程,然后打印一条消息


你的问题是什么?是每个方法都有一个线程在运行,你需要在某个地方得到这个异常,还是仅仅需要知道是否有两个对话?或者,当两个线程都在运行时,您实际上希望在同一个对话中捕获两个错误?捕获异常是为了不中断程序的执行,因此当捕获异常时,您只中断该方法的执行,您有两种不同的方法,因此您将有两种不同的例外情况。首先感谢您的回复@Joao Esperancinha是的,我为每个方法运行线程。我的问题是为什么程序会停止在这里工作。因为,当我分别启动其中一个线程时。它工作得很好。当我启动两个线程时,应该有两个错误窗口,但你可以看到空白的错误窗口和程序不工作。你的问题是什么?是每个方法都有一个线程在运行,你需要在某个地方获得此异常,还是只需要知道是否有两个对话?或者,当两个线程都在运行时,您实际上希望在同一个对话中捕获两个错误?捕获异常是为了不中断程序的执行,因此当捕获异常时,您只中断该方法的执行,您有两种不同的方法,因此您将有两种不同的例外情况。首先感谢您的回复@Joao Esperancinha是的,我为每个方法运行线程。我的问题是为什么程序会停止在这里工作。因为,当我分别启动其中一个线程时。它工作得很好。当我启动两个线程时,应该有两个错误窗口,但您可以看到空白的错误窗口和程序不工作。非常感谢:)这节省了我的时间:)非常感谢:)这节省了我的时间:)