Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在代码的多个部分上执行相同的异常处理。Java Android_Java_Android_Exception_Exception Handling - Fatal编程技术网

在代码的多个部分上执行相同的异常处理。Java Android

在代码的多个部分上执行相同的异常处理。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; }

我创建了当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那么我应该使用什么?