在代码的多个部分上执行相同的异常处理。Java Android
我创建了当EditText有错误(或空)数据字符串时引发的异常 看起来像这样在代码的多个部分上执行相同的异常处理。Java Android,java,android,exception,exception-handling,Java,Android,Exception,Exception Handling,我创建了当EditText有错误(或空)数据字符串时引发的异常 看起来像这样 private class NumberInputEditTextExeception extends NumberFormatException { public EditText editText; public NumberInputEditTextExeception (EditText editText) { this.editText = editText; }
private class NumberInputEditTextExeception extends NumberFormatException {
public EditText editText;
public NumberInputEditTextExeception (EditText editText) {
this.editText = editText;
}
}
specialTry () {
seconds = this.getIntFromEditText(this.secondsEditText); // if that throws exception, it will call "catch" block and go to the next line. NOT break out of the scope.
minutes = this.getIntFromEditText(this.minutesEditText);
hours = this.getIntFromEditText(this.hoursEditText);
} catch (NumberInputEditTextExeception e) {
this.setErrorAnimationOnView(e.editText);
}
以及引发该异常的方法:
private int getIntFromEditText (EditText et) throws NumberInputEditTextExeception {
try {
return Integer.parseInt(et.getText().toString());
} catch (NumberFormatException numberFormatException) {
throw new NumberInputEditTextExeception(et);
}
}
以及处理它的代码,并调用方法来显示“错误动画”
我是否可以压缩重复的行:
try {
seconds = this.getIntFromEditText(this.secondsEditText);
} catch (NumberInputEditTextExeception e) {
this.setErrorAnimationOnView(e.editText);
}
是否有任何语法允许在抛出异常时执行类似“不会超出整个范围”(由大括号分隔)的操作?所以我可以这样做
private class NumberInputEditTextExeception extends NumberFormatException {
public EditText editText;
public NumberInputEditTextExeception (EditText editText) {
this.editText = editText;
}
}
specialTry () {
seconds = this.getIntFromEditText(this.secondsEditText); // if that throws exception, it will call "catch" block and go to the next line. NOT break out of the scope.
minutes = this.getIntFromEditText(this.minutesEditText);
hours = this.getIntFromEditText(this.hoursEditText);
} catch (NumberInputEditTextExeception e) {
this.setErrorAnimationOnView(e.editText);
}
或者我偶然发现这个错误,因为我的设计很糟糕,我应该改变我的设计?是的,你可以。如果更改
getIntFromEditText
方法,使其不会引发异常,而只是返回0
作为错误,则可以压缩此代码。新方法:
private int getIntFromEditText (EditText et) {
try {
return Integer.parseInt(et.getText().toString());
} catch (NumberFormatException numberFormatException) {
return 0;
}
}
现在,您的getEndTimeRomeditText
方法看起来更像这样:
private long getEndTimeFromEditTexts () {
int seconds = 0;
int minutes = 0;
int hours = 0;
seconds = this.getIntFromEditText(this.secondsEditText);
minutes = this.getIntFromEditText(this.minutesEditText);
hours = this.getIntFromEditText(this.hoursEditText);
long endTimeMs = System.currentTimeMillis() + (seconds * 1000) + (minutes * 1000 * 60) + (hours * 1000 * 60 * 60);
return endTimeMs;
}
最终结果将与您的代码所做的完全相同。您可以使用常规代码流,而不是使用异常来触发代码的执行。像下面这样
interface EditTextErrorHandler {
void onError(EditText et);
}
private int getIntFromEditText (EditText et, EditTextErrorHandler handler) {
try {
return Integer.parseInt(et.getText().toString());
} catch (NumberFormatException numberFormatException) {
handler.onError(et);
return 0;
}
}
private long getEndTimeFromEditTexts () {
EditTextErrorHandler handler = new EditTextErrorHandler() {
@Override
public void onError(EditText et) {
setErrorAnimationOnView(et);
}
};
int seconds = this.getIntFromEditText(this.secondsEditText, handler);
int minutes = this.getIntFromEditText(this.minutesEditText, handler);
int hours = this.getIntFromEditText(this.hoursEditText, handler);
// values will be 0 when an error occured and the handler code is executed for each
}
你是说在另一个试块里面放一个试块吗?当你尝试这样做时发生了什么?@kevinworkman我想检查每个EditText是否有解析问题。简短的回答是:不,你不能压缩你的try-catch块。如果你想从每个函数中捕获一个异常并继续执行,你必须把它们放在不同的try块中。问题在于你的设计。您不应该使用自定义异常来处理UI验证错误。@EkoostikMartin那么我应该使用什么?