我正在创建一个小的Timer程序,它有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',按钮停止工作。我不明白为什么分钟和秒数字段完美地工作并且它们是理想的。我认为 hrsChosen 和 minsChosen / secsChosen
之间没有任何区别答案 0 :(得分:3)
当你试图从异常本身处理异常时,你已经有了倒退的事情,而这不是应该发生的事情。相反,只需让您的自定义异常类扩展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);
}
}
您可以考虑扩展其他Exception构造函数。
JOptionPane代码应该只在应该处理异常的其他地方的代码中,抛出异常。
catch(OverTwentyFourException ee) {
// **** JOptionPane code goes here ****
userInputHrs.setText("00");
}
请注意,您的代码也有点不寻常,因为您在同一方法中抛出并捕获此相同的异常。这样做你似乎并没有获得太多收益。
无关的问题:
static
修饰符,因为您的字段应该绝对不是静态的,标记为这样。看起来您正试图以错误的方式修复对非静态字段的访问。您不希望将这些字段设置为静态,而是希望避免以任何静态方式访问它们。 startButton.getIcon().toString()
。为什么要获取Icon的String表示?你打印过这个吗?这不是你的想法,它可能搞乱了你的程序。相反,也许你想获得ActionEvent的actionCommand。