Почему метод возвращает -1? - PullRequest
0 голосов
/ 17 августа 2011

Я читаю код из одной книги и имею этот метод:

public int getScore(String name) {
  try {
     //some code here
     return score;
  } catch (Exception e) {
     e.printStackTrace();
     return -1;
  }
}

Почему этот метод в catch возвращает -1? Почему не 5? Это какое-то соглашение?

Ответы [ 6 ]

11 голосов
/ 17 августа 2011

-1 - это стандартный код ошибки, когда вызывающая сторона ожидает положительное значение int

но на самом деле в этом случае завернутый RuntimeException или более конкретный был бы намного лучше

4 голосов
/ 17 августа 2011

Я предполагаю, что автор использует этот код, чтобы убедиться, что что-то возвращается, а вызывающий getScore может проверить, правильно ли был вызван score.

В коде:

int theScore = getScore("My Name");

if(theScore == -1) {
    // Oh no, there was an error!
}

Мы можем использовать проверку для -1, чтобы убедиться, что код знает, когда getScore не удается.

3 голосов
/ 17 августа 2011

Почему метод возвращает -1?

Поскольку он очень плохо спроектирован для любого исключения. Этот метод был бы лучше разработан, если бы он объявил, что он выбрасывает исключение (я), представляющее интерес, и, в частности, , а не , перехватывая также все RuntimeExceptions.

2 голосов
/ 17 августа 2011

Первая проблема - мы не знаем, что такое исключения.Поймать каждое исключение - очень плохое решение.Эти исключения были выдвинуты по какой-то причине, чтобы вы точно знали, что пошло не так, и могли бы правильно с этим справиться.

Плохо:

public int getScore(String name) {
  try {
     int score = scores.getScoreForName(name);
     return score;
  } catch (Exception e) { // catches everything
     e.printStackTrace();
     return -1;
  }
}

Маргинально лучше ...

public int getScore(String name) {
    try {
     int score = scores.getScoreForName(name);
     return score;
  } catch(NameNotFoundException) {
    e.printStackTrace();
    return -2; // now we know what happened, not just a general error
  } catch (Exception e) { // catches everything
    e.printStackTrace();
    return -1; // generally error
  }
}

Намного лучше:

/**
 * Get the score for a given name. Will throw a runtime exception if the 
 * name doesn't exist.
 * @param name The name to get the score for
 * @return the score for the name
 * @throws NameNotFoundException if the name doesn't exist in the database.
 */
public int getScore(String name) {
    return scores.getScoreForName(name);
}
2 голосов
/ 17 августа 2011

Причина, по которой они выбрали -1 вместо 5, заключается в том, что -1 не является возможным показателем для возврата из метода getScore. Поэтому, когда вы вызываете функцию, вы можете легко проверить, была ли она возвращена -1 или нет.

Если бы это была функция, которая могла бы реально вернуть -1 для успешного выполнения, -1 был бы плохим выбором индикатора флага. Таким образом, более подходящим выбором может быть -9999 или что-то смешное.

2 голосов
/ 17 августа 2011

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

...