Правильная обработка исключения - PullRequest
1 голос
/ 02 октября 2011

Я не очень хорош в обработке исключений, поэтому мне нужна подсказка по этому поводу: Я хочу поместить массивы в коллекцию (ArrayList), все из которых должны быть одинаковой длины. В противном случае ошибки возникают в вычислениях. Когда в ArrayList нужно вставить массив не желаемой длины, я бы хотел сгенерировать исключение с сообщением. Какое исключение подходит для этого случая?

Что меня беспокоит, так это то, что я должен проверить размер массива, который должен быть вставлен (с помощью оператора if). Разумно ли иметь оператор if внутри блока try?

Вот соответствующий фрагмент кода:

входные данные: arrayList

длина массива: длина массива, указанного первым вставленным массивом

Может ли кто-нибудь изменить блок try - catch?

public void insertData(double[] arraydata){
    if(this.inputdata.isEmpty()){
        inputdata.add(arraydata);
        this.arraylength = arraydata.length; 
    }else{
        try {
           if(this.arraylength == arraydata.length)
               inputdata.add(arraydata);
        }catch(Exception exception){
            System.err.printf("Missmatch array dimensions in %d place",inputdata.size()+1);           
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 02 октября 2011

Что вы делаете в

    try {
       if(this.arraylength == arraydata.length)
           inputdata.add(arraydata);
    }catch(Exception exception){
        System.err.printf("Missmatch array dimensions in %d place",inputdata.size()+1);           
    }

Является ли перехват исключением. Но inputdata.add не собирается бросать никаких исключений. Вместо этого вы должны выбросить исключение, чтобы вызывающие абоненты знали, что что-то не так:

   if(this.arraylength != arraydata.length)
       throw new IllegalArgumentException("Array length " + arraydata.length 
           + " is not same as previous length " + this.arraylength);
   inputdata.add(arraydata);

Исключение включает в себя полезное сообщение, чтобы сообщить вызывающему абоненту, в чем заключается несоответствие.

Обратите внимание, что я перевернул тест, если длина не приемлема, тогда выдается исключение; в противном случае выполнение переходит к следующей строке.

1 голос
/ 02 октября 2011

Какое исключение подходит? Зависит. Вот несколько вещей для рассмотрения.

  1. Является ли этот код частью метода, и было ли намерение, что пользователь должен передать массив правильного размера? Вызывающий объект допустил ошибку, поэтому используйте исключение IllegalArgumentException.
  2. Является ли этот код частью большой строки кода, и было ли намерение, чтобы код создавал массивы правильного размера? Одно из ваших предположений неверно, поэтому используйте исключение IllegalStateException.
  3. Ситуация с массивами неправильного размера в некотором роде законна, и ваш обработчик исправит ситуацию на некотором уровне, а затем продолжит. Я бы бросил свое исключение для этого случая.

Ваш код, кажется, case (1). Предоставленные ответы показывают несколько хороших способов справиться с этим. Мне нравится использовать Предварительные условия Guava самому, так как они самодокументируются и менее подвержены ошибкам (нет операторов if, просто чтобы направить выполнение вокруг ошибок, требующих обслуживания - просто добавьте новые вызовы checkSomething, где они имеет смысл):

import static com.google.common.base.Preconditions.checkArgument;

<snip>

public void insertData(double[] arraydata) {
    checkArgument(this.arraylength == arraydata.length,
            "Ever array needs same length...");
    inputdata.add(arraydata);
}
1 голос
/ 02 октября 2011

Исключения должны быть только для исключительных случаев. Если это частое явление, возможно, вы захотите обработать его по-другому, используя стандартную логику в рабочем процессе. Например, вы можете вернуть n true, если вы можете вставить данные, и false, если массив для вставки имеет неправильную длину. Или вы можете проверить, когда пользователь вводит значения массива, и сказать им, что длина должна быть x.

Если это действительно исключительный случай, выведите IllegalArgumentException , как в

if(this.arraylength == arraydata.length)
    inputdata.add(arraydata);
} else {
    throw new IllegalArgumentException("Ever array needs same length...");
}

что-то в этом роде.

Как написано, ваш код сейчас ловит все исключения, выданные в операции add. Вы должны бросить вместо catch исключение в вашем методе insertData, как показывает мой пример. Исключение должно быть перехвачено вне метода вставки данных. Это означает, что вам не нужен оператор try / catch в insertData.

Также обратите внимание, что IllegalArgumentException является исключением времени выполнения, поэтому его не нужно бросать или перехватывать, если вы этого не хотите. Вы все еще можете поймать его, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...