Вопрос о попытке поймать заявление - PullRequest
0 голосов
/ 30 марта 2011

Если я напишу этот код:

Document d = searcher.doc(docId);
d.get("latitude")

Я получаю

unreported exception ... must be caught or declared to be thrown

Если я напишу это,

try {
    Document d = searcher.doc(docId);
}
d.get("latitude")

Я, очевидно, получаю:

cannot find symbol
symbol  : variable d

Если я напишу это

Document d;
try {
d = searcher.doc(docId);
}
d.get("latitude");

Я получаю это:

variable d might not have been initialized

Так как я не хочу распространять try / catch на весь документ, как я могу решить эту проблему?

спасибо

Ответы [ 7 ]

4 голосов
/ 30 марта 2011
Document d = null;

вместо

Document d;

Хотя тогда вам придется беспокоиться о NullPointerException позже в будущем, когда вы используете d

3 голосов
/ 30 марта 2011

Попробуйте:

Document d = null;
try {
   d = searcher.doc(docId);
   d.get("latitude");
}
2 голосов
/ 30 марта 2011

Вы делаете то, что говорится в сообщении: Просто инициализируйте вашу переменную "d" с нуля в начале:

Document d = null;
try {
  d = searcher.doc(docId);
}
d.get("latitude"); 

В любом случае, будьте осторожны! если возникает исключение, ваша переменная "d" будет нулевой, и вы получите ссылку на объект, а не установленное исключение! Либо включите d.get("latitude"); в блок try, либо проверьте нулевое значение перед вызовом этой строки.

1 голос
/ 30 марта 2011

Вы должны инициализировать вашу переменную и перехватить исключение (вы можете изменить имя исключения и уровень сообщения в соответствии с вашими потребностями).

Document d = null;
try {
   d = searcher.doc(docId);
   d.get("latitude");
} catch (Exception ex){
   ex.getMessage();
}
0 голосов
/ 30 марта 2011

Если ваш перехват заставляет пропустить остальную часть метода (с помощью оператора return или throw), или если вы инициализируете d в перехвате, вы не должны получить эту ошибку..

Document d;
try {
    d = searcher.doc(docId);
} catch (SomeException e) {
    return null;
    //throw new RuntimeException(e);
    //d = some default value
}
d.get("latitude");

Просто инициализация d = null просто вызовет нулевой указатель, когда произойдет исключение (скрывая фактическую причину).

0 голосов
/ 30 марта 2011

Вы можете просто инициализировать его как ноль, но вы не должны, по моему мнению.

Если метод выдает исключение, тогда d == null, поэтому вам нужно либо обработать этот случай с помощью if (d != null), либо просто указать область видимости d внутри блока try.

Я бы сделал последнее.

0 голосов
/ 30 марта 2011

Должно быть:

Document d = null;
try {
    d = searcher.doc(docId);
} catch (Exception e) {
    //...
}
d.get("latitude");
...