Возвращаемое значение типа, если RunTimeException было выброшено и не перехвачено - PullRequest
0 голосов
/ 14 апреля 2010

Я использую Gson для анализа Json. Что я не понимаю, какой будет тип возвращаемого значения, если вы не поймете Runtime Exception . Я ожидал, что это будет null, но это не null при оценке с помощью простого оператора if.

Мой код выглядит примерно так:

public X x(final String jsonString) {
   return gson.fromJson(jsonString, X.class);
}

затем из другой функции я вызываю функцию:

public void y() {
  final X x = x();
  if (x == null) {
    System.out.println("x == null");
  }
}

Я ожидал, что x будет нулевым, но это не потому, что оператор print не вызывается? Какое значение x? Я решил свою проблему, используя блок catch в функции x() и возвращая null из блока catch. Но мне просто интересно, каково значение функции x() (если есть?)? Надеюсь, у меня вообще есть какой-то смысл.

1 Ответ

3 голосов
/ 14 апреля 2010

Если x() вызывает исключение, переменная x остается неинициализированной, поскольку поток управления был прерван. Без try / catch исключение продолжает расти в стеке, и x никогда не может быть использовано. При использовании метода try / catch x действителен только внутри блока, поэтому, если произойдет исключение, он не будет использоваться.

Если вы попытаетесь сделать что-то вроде:

X x;
try {
    x = x();
} catch(RuntimeException e) {}
if (x == null) {
    ...

вы получите ошибку «переменная x, возможно, не была инициализирована», поскольку поток управления может обойти присвоение

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