gpt4 book ai didi

java - 使用多个文本字段进行正确的异常处理

转载 作者:行者123 更新时间:2023-12-02 03:00:14 25 4
gpt4 key购买 nike

程序图片: program image

这是“+”按钮调用的方法的代码

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class Calc extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel contentPane;

private JTextField tf_1; // contains first operand
private JTextField tf_2; // contains second operand
private JTextField tf_3; // result

private JButton bu_1; // plus operation
private JButton bu_2; // multiplication

/**
* Create the frame.
*/
public Calc() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 387, 143);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
setContentPane(contentPane);

tf_1 = new JTextField();
tf_1.setBounds(20, 35, 60, 20);
contentPane.add(tf_1);
tf_1.setColumns(10);

tf_2 = new JTextField();
tf_2.setBounds(90, 35, 60, 20);
contentPane.add(tf_2);
tf_2.setColumns(10);

tf_3 = new JTextField();
tf_3.setBounds(272, 35, 70, 20);
contentPane.add(tf_3);
tf_3.setColumns(10);

//button 1
bu_1 = new JButton("+");
bu_1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addOperands();
}
});
bu_1.setBounds(160, 34, 41, 23);
contentPane.add(bu_1);

//button 2
bu_2 = new JButton("*");
bu_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
multiplyOperands();
}

});;
bu_2.setBounds(211, 34, 41, 23);
contentPane.add(bu_2);

}

private void addOperands() {
double value_1, value_2;
try {
value_1 = Double.parseDouble(tf_1.getText());

} catch (NumberFormatException e) {
tf_1.setBackground(Color.red);
tf_1.requestFocus();
}
try {
value_2 = Double.parseDouble(tf_2.getText());
} catch (Exception e) {
tf_2.setBackground(Color.red);
tf_2.requestFocus();
}
tf_3.setText(String.valueOf(value_1 + value_2));
}

private void multiplyOperands() {
// TODO implement multiply operation
}
}

目前,我很难正确找出哪个 textField 引发异常。上面的代码不起作用,因为 double 值未初始化。但如果 tf_X 值不是数字,我不想只用 0 进行计算。

我还尝试让 addOperands() 返回一个 double 值,但是出现异常时不可能返回 null

我想要什么:

  • 如果任何值不是数字,则不计算结果(抛出 NumberFormatException)
  • 将包含 NaN 值的文本字段的背景设置为红色
  • 清除tf_3的当前值:tf_3.setText("");

有人可以帮我解决这个问题吗?

最佳答案

在您的addOperands代码中

private void addOperands() {
double value_1, value_2;
try {
value_1 = Double.parseDouble(tf_1.getText());
} catch (NumberFormatException e) {
tf_1.setBackground(Color.red);
tf_1.requestFocus();
}
try {
value_2 = Double.parseDouble(tf_2.getText());
} catch (Exception e) {
tf_2.setBackground(Color.red);
tf_2.requestFocus();
}
tf_3.setText(String.valueOf(value_1 + value_2));
}

当您处于第一个捕获

    try {
value_1 = Double.parseDouble(tf_1.getText());
} catch (NumberFormatException e) {
// here you know that tf_1 is non-double
tf_1.setBackground(Color.red);
tf_1.requestFocus();
}

您知道第一个输入包含错误的输入。第二个输入也是如此。如果您不想显示 0 结果,您有 2 个选择:要么通过简单地将 return 放入 catch 子句来停止处理第一个错误,要么添加标志)看看是否一切都很好

private void addOperands() {
double value_1, value_2;
boolean good = true;
try {
value_1 = Double.parseDouble(tf_1.getText());
} catch (NumberFormatException e) {
good = false;
tf_1.setBackground(Color.red);
tf_1.requestFocus();
}
try {
value_2 = Double.parseDouble(tf_2.getText());
} catch (Exception e) {
good = false;
tf_2.setBackground(Color.red);
tf_2.requestFocus();
}
if(good)
tf_3.setText(String.valueOf(value_1 + value_2));
else
tf_3.setText("Bad input");
}

更新

如果你想分解你的代码(通常这是一个好主意),你可以这样做

private Double readDoubleOrHighlight(JTextField tf) {
try {
double res = Double.parseDouble(tf.getText());
tf.setBackground(whatever-default-background-is);
return res;
} catch (NumberFormatException e) {
tf.setBackground(Color.red);
tf.requestFocus();
return null;
}
}

private void addOperands() {
Double value_1 = readDoubleOrHighlight(tf_1);
Double value_2 = readDoubleOrHighlight(tf_2);
if((value_1 != null) && (value_2 != null))
tf_3.setText(String.valueOf(value_1 + value_2));
else
tf_3.setText("Bad input");
}

注意:这里我有效地使用了Double作为Option[double],无论如何Java都不支持它(提示:google Option,它是一个强大的想法或从 Option type in wiki 开始)。

更新#2

这次介绍高阶函数。如果添加一段这样的代码

static interface BinaryOp {
double calc(double arg1, double arg2);
}

private void applyBinaryOp(BinaryOp op) {
Double value_1 = readDoubleOrHighlight(tf_1);
Double value_2 = readDoubleOrHighlight(tf_2);
if((value_1 != null) && (value_2 != null)) {
double res = op.calc(value_1, value_2);
tf_3.setText(res);
}
else
tf_3.setText("Bad input");
}

您可以将点击监听器简化为这样的内容

    bu_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
applyBinaryOp(new BinaryOp(){
public double calc(double arg1, double arg2) {
return arg1 * arg2;
}
});
}
});

使用 Java 8 lambda 语法就更简单了。

关于java - 使用多个文本字段进行正确的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42458537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com