Java Swing GUI Try / Catch Block

我只是学习Javaexception处理和Java。 我做了一个Swing GUI,用户将整数输入两个字段,然后单击带有算术function的单选按钮,答案将出现在第三个文本字段中。 我希望包含一个try / catch块来捕获exception,如果用户将前两个字段中的一个留空或者输入除整数之外的其他字段,如果用户试图除以零则返回第二个字段。 该表单在function上有效,但不会捕获错误,只返回堆栈跟踪并使程序崩溃。 我有一种感觉,我只是在错误的地方有try / catch块,但是我越是将它移动到更糟糕的地方。 有人能说出错的地方吗?

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.WindowConstants; import javax.swing.SwingUtilities; public class Main extends javax.swing.JFrame { private JTextField aTextField; private JRadioButton dRadioButton; private ButtonGroup buttonGroup; private JLabel aLabel; private JRadioButton cRadioButton; private JRadioButton bRadioButton; private JRadioButton aRadioButton; private JTextField cTextField; private JTextField bTextField; /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main inst = new Main(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } public Main() { super(); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(null); { aTextField = new JTextField(); getContentPane().add(aTextField); aTextField.setBounds(12, 49, 62, 30); } { bTextField = new JTextField(); getContentPane().add(bTextField); bTextField.setBounds(178, 49, 62, 31); } { cTextField = new JTextField(); getContentPane().add(cTextField); cTextField.setBounds(297, 49, 62, 30); } { aRadioButton = new JRadioButton(); getContentPane().add(aRadioButton); aRadioButton.setText("+"); aRadioButton.setBounds(91, 18, 43, 20); aRadioButton.setFont(new java.awt.Font("Segoe UI", 1, 16)); aRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { aRadioButtonActionPerformed(evt); } }); getButtonGroup().add(aRadioButton); } { bRadioButton = new JRadioButton(); getContentPane().add(bRadioButton); bRadioButton.setText("-"); bRadioButton.setBounds(91, 53, 43, 20); bRadioButton.setFont(new java.awt.Font("Segoe UI", 1, 16)); bRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { bRadioButtonActionPerformed(evt); } }); getButtonGroup().add(bRadioButton); } { cRadioButton = new JRadioButton(); getContentPane().add(cRadioButton); cRadioButton.setText("*"); cRadioButton.setBounds(91, 99, 43, 20); cRadioButton.setFont(new java.awt.Font("Segoe UI", 1, 16)); cRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { cRadioButtonActionPerformed(evt); } }); getButtonGroup().add(cRadioButton); } { dRadioButton = new JRadioButton(); getContentPane().add(dRadioButton); getContentPane().add(getALabel()); dRadioButton.setText("/"); dRadioButton.setBounds(91, 140, 46, 20); dRadioButton.setFont(new java.awt.Font("Segoe UI", 1, 16)); dRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { dRadioButtonActionPerformed(evt); } }); getButtonGroup().add(dRadioButton); } pack(); setSize(400, 300); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "Error: You must enter an integer"); } catch (ArithmeticException e) { JOptionPane.showMessageDialog(null, "Error: You cannot divide by zero"); } } private ButtonGroup getButtonGroup() { if (buttonGroup == null) { buttonGroup = new ButtonGroup(); } return buttonGroup; } private JLabel getALabel() { if (aLabel == null) { aLabel = new JLabel(); aLabel.setText("="); aLabel.setBounds(249, 56, 30, 16); aLabel.setFont(new java.awt.Font("Segoe UI", 1, 16)); } return aLabel; } private void aRadioButtonActionPerformed(ActionEvent evt) { String a = aTextField.getText(); int i = Integer.parseInt(a); String b = bTextField.getText(); int j = Integer.parseInt(b); int k = i + j; cTextField.setText(Integer.toString(k)); } private void bRadioButtonActionPerformed(ActionEvent evt) { String a = aTextField.getText(); int i = Integer.parseInt(a); String b = bTextField.getText(); int j = Integer.parseInt(b); int k = i - j; cTextField.setText(Integer.toString(k)); } private void cRadioButtonActionPerformed(ActionEvent evt) { String a = aTextField.getText(); int i = Integer.parseInt(a); String b = bTextField.getText(); int j = Integer.parseInt(b); int k = i * j; cTextField.setText(Integer.toString(k)); } private void dRadioButtonActionPerformed(ActionEvent evt) { String a = aTextField.getText(); int i = Integer.parseInt(a); String b = bTextField.getText(); int j = Integer.parseInt(b); int k = i / j; cTextField.setText(Integer.toString(k)); } } Here is the stack trace I receive: Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "vvvv" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at Main.aRadioButtonActionPerformed(Main.java:154) at Main.access$0(Main.java:152) at Main$2.actionPerformed(Main.java:78) 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.JToggleButton$ToggleButtonModel.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.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(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) 

您需要将try-catch移动到操作预先形成的方法,现在,它们仅在Java设置GUI时,当用户执行操作(actionPreformed)时将调用这些方法,因此他们需要尝试catch,而不是设置方法。

 private void cRadioButtonActionPerformed(ActionEvent evt) { try { String a = aTextField.getText(); int i = Integer.parseInt(a); String b = bTextField.getText(); int j = Integer.parseInt(b); int k = i * j; cTextField.setText(Integer.toString(k)); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "Error: You must enter an integer"); } catch (ArithmeticException e) { JOptionPane.showMessageDialog(null, "Error: You cannot divide by zero"); } } 

将try-catch添加到使用此类似代码的所有ActionPreformed方法,只需确保每个actionPreformed方法仍然拥有它自己的代码,只需使用它周围的try-catch块

您应该将try catch块放在Integer.parseInt()调用的位置。

如果你不检查你的每个事件方法,你会得到例外,所以你可以做这样的事情来解决它,

 private void aRadioButtonActionPerformed(ActionEvent evt) { String a = aTextField.getText(); String b = bTextField.getText(); // you may get empty string here so check if the texbox is empty ? int i=0,j=0; try{ if(a.length()>0 || b.length()>0){ i = Integer.parseInt(a); j = Integer.parseInt(b); }else{ if(a.length()<1 && b.length()>0){ i = Integer.parseInt(a); }else{ if(b.length()<1 && a.length()>0) j = Integer.parseInt(b); } } int k = i + j; }catch(Exception e){ System.out.println("Exception:"+e); } cTextField.setText(Integer.toString(k)); } 

为你做同样的事情 – ,*,/单选按钮监听器