Почему в этом коде используется throw?

175
10 октября 2019, 23:20
private static String getOperandText(EditText operandEditText)  {
    String operandText = operandEditText.getText().toString();
    if(TextUtils.isEmpty(operandText)){
        throw new NumberFormatException("Operand cannot be empty");
    }
    return operandText;
}
private static Double getOperand(EditText operandEditText) {
    String operandText = getOperandText(operandEditText);
    return Double.valueOf(operandText);
}

В этом коде я получаю число, которое ввел в EditText, и если оно пустое то выбрасывается исключение. Так вот почему именно нужно выбросить исключение. Почему нельзя сделать

if(TextUtils.isEmpty(operandText)){
    TextView.setText("Cannot be empty")
}

Вот код который вызывает этот метод:

private void compute(Calculator.Operator operator) {
    double operandOne;
    double operandTwo;
    try {
        operandOne = getOperand(mOperandOneEditText);
        operandTwo = getOperand(mOperandTwoEditText);
    } catch (NumberFormatException nfe) {
        Log.e(TAG, "NumberFormatException", nfe);
        mResultTextView.setText(getString(R.string.computationError));
        return;
    }
    String result;
    switch (operator) {
        case ADD:
            result = String.valueOf(
                    mCalculator.add(operandOne, operandTwo));
            break;
        case SUB:
            result = String.valueOf(
                    mCalculator.sub(operandOne, operandTwo));
            break;
        case DIV:
            result = String.valueOf(
                    mCalculator.div(operandOne, operandTwo));
            break;
        case MUL:
            result = String.valueOf(
                    mCalculator.mul(operandOne, operandTwo));
            break;
        default:
            result = getString(R.string.computationError);
            break;
    }
    mResultTextView.setText(result);
}

И я не пойму, что делает return внутри блока catch? Он завершает метод compute ??!

Answer 1

Это концептуально спорный вопрос.

Некоторые считают, что если на вход в метод приходят не валидные параметры или какие-то данные, необходимые для вычисления, не валидны, то нужно выбрасывать исключение. Вполне распространённая практика.

Вот только в вашем примере, оно реализовано наполовину. Методы, выбрасывающие исключение, должны указывать, какие исключения могут быть выброшены:

private static String getOperandText(EditText operandEditText) throws NumberFormatException {
    String operandText = operandEditText.getText().toString();
    if(TextUtils.isEmpty(operandText)){
        throw new NumberFormatException("Operand cannot be empty");
    }
    return operandText;
}

Ну а return в catch выходит из метода. Т.е, метод compute дальше выполняться не будет.

В вашем примере даже если getOperandText не выбросить исключение, а просто вернёт null, то NumberFormatException всё равно вылетит в getOperand на строке Double.valueOf.

READ ALSO
Сериализовать данные из JTable

Сериализовать данные из JTable

Хочу сохранить данные из таблицы JTable и, соответственно, восстановить их при новом запуске программыВ коде инициализирована таблица table

194
Работа с PDF в JEE

Работа с PDF в JEE

Делаю на JSF страничку на которой будет каталог файлов PDF с возможностью удаления/добавленияПодскажите как лучше реализовать хранение PDF, сначала...

177
Работа с датой в Android

Работа с датой в Android

Как спарсить дату из формата ддмм

162