gpt4 book ai didi

Java自定义异常无法正常工作

转载 作者:行者123 更新时间:2023-11-30 06:06:30 27 4
gpt4 key购买 nike

我正在创建一个小计时器程序,它有 3 个输入字段(小时、分钟和秒)。由于某种原因,OverTwentyFourException 异常不适用于小时输入字段。这是我的部分代码:

static JTextField userInputHrs;
static JTextField userInputMins;
static JTextField userInputSecs;
static int hrsChosen;
static int minsChosen;
static int secsChosen;

startButton.addActionListener(e -> {
switch(startButton.getIcon().toString()) {
case "Pause":
timer.TimerFunctionality.pause();
break;
case "Resume":
timer.TimerFunctionality.resume();
break;
default:
try {
//Calculate seconds from user input
hrsChosen = Integer.parseInt(userInputHrs.getText());
minsChosen = Integer.parseInt(userInputMins.getText());
secsChosen = Integer.parseInt(userInputSecs.getText());
secsRemaining = hrsChosen * 3600 + minsChosen * 60 + secsChosen;
if(hrsChosen < 0 || minsChosen < 0 || secsChosen < 0)
throw new NegativeException();
if(hrsChosen > 24)
throw new OverTwentyFourException();
//Getter for two thirds of userInput for color change
twoThirdsInput = 66.66 * secsRemaining / 100;
//Getter for one third of userInput for color change
oneThirdInput = 33.33 * secsRemaining / 100;
timer.TimerFunctionality.start();
}
catch(NegativeException ee) {
userInputHrs.setText("00");
userInputMins.setText("00");
userInputSecs.setText("00");
}
catch(OverTwentyFourException ee) {
userInputHrs.setText("00");
}
catch(NumberFormatException ee) {
userInputHrs.setText("00");
userInputMins.setText("00");
userInputSecs.setText("00");
JOptionPane.showMessageDialog(
Gui.this, "INPUT ERROR: Please use digits",
"Invalid Input",
JOptionPane.ERROR_MESSAGE
);
}
}
});

OverTwentyFourException 类:

class OverTwentyFourException extends Exception {
OverTwentyFourException() {
Gui gui = new Gui();
JOptionPane.showMessageDialog(
gui,
"INPUT ERROR: The 'Hours' number needs to be lower than 24",
"Invalid Input - Hours",
JOptionPane.ERROR_MESSAGE
);
}

}

如果我在小时字段中输入“25”,我会收到消息对话框,但文本不会按照我的代码设置回“00”,并且按钮将停止工作。我不明白为什么分钟和秒字段工作完美并且它们是相同的。我认为 hrsChosenminsChosen/secsChosen

之间没有任何区别

最佳答案

当您试图从异常本身内部处理异常时,事情就发生了倒退,而这不是应该发生的事情。相反,只需让自定义异常类扩展 Exception 类,也许为其提供一个接受 String 的构造函数,并使用相同的 String 调用其中的 super 构造函数。例如异常可能如下所示:

public class OverTwentyFourException extends Exception {
// allow it to handle exceptions with or without a message String
// the constructor below will call the super's default constructor
public OverTwentyFourException() {}

public OverTwentyFourException(String message) {
super(message);
}
}

您可以考虑扩展其他异常构造函数。

JOptionPane 代码应该只出现在应该处理异常、抛出异常的其他地方的代码中。

catch(OverTwentyFourException ee) {
// **** JOptionPane code goes here ****
userInputHrs.setText("00");
}

请注意,您的代码也有点不寻常,因为您在同一方法中抛出并捕获相同的异常。这样做似乎并没有给你带来太多收获。

不相关的问题:

  • 您似乎错误地使用了 static 修饰符,因为您的字段绝对应该是静态的,并被标记为静态。看来您正在尝试以错误的方式修复对非静态字段的访问。您不希望将这些字段设置为静态,而是希望避免以任何静态方式访问它们。
  • 这看起来很奇怪:startButton.getIcon().toString()。为什么要获取图标的字符串表示形式?你打印了这个吗?它不是你想象的那样,而且很可能会搞乱你的程序。相反,您可能想获取 ActionEvent 的 actionCommand。

关于Java自定义异常无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43902799/

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