поток данных выполнения исключений, почему мой объект является нулевым, когда выброшено исключение? - PullRequest
0 голосов
/ 16 февраля 2011

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

Я вызываю функцию, которая может выдавать зарегистрированные исключения. Когда это происходит, myXDSConsumerRequestHandler остается нулевым. Проблема в том, что я могу восстановить из зарегистрированных событий (проверил объект на вызываемом). Так как же мне вызвать retrieveDocuments и вернуть мой объект?

Я понимаю, что поток генерируется, когда генерируется исключение, поэтому я должен перехватывать исключения на более высоком уровне?

Это звонящий:

try {
    myXDSConsumerRequestHandler = 
        RetrieveDocSetUtil.retrieveDocuments(NIST, multipleRetrieveMap);
} catch (VerboseIllegalArgumentException e) {

} catch (XDSException e) {

}

Это вызываемый абонент:

public static RetrieveDocumentSetImpl retrieveDocuments(
        String repoURL, Map<String, String> docRepoMap) 
    throws VerboseIllegalArgumentException, XDSException {

    RetrieveDocumentSetImpl myXDSConsumerRequestHandler = 
            new RetrieveDocumentSetImpl(repoURL);
    myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);
    return myXDSConsumerRequestHandler;
}

Спасибо!

Ответы [ 4 ]

3 голосов
/ 16 февраля 2011

Если retrieveDocuments() выдает исключение, то у него никогда не будет возможности что-то вернуть. Оператор myXDSConsumerRequestHandler = RetrieveDocSetUtil.retrieveDocuments() обычно не заканчивается.

Невозможно как перехватить исключение из метода, так и получить возвращаемое значение.

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

3 голосов
/ 16 февраля 2011

Ваш код выполняется в следующем порядке:

  1. Звоните retrieveDocuments
  2. Присвойте результат myXDSConsumerRequestHandler

Если во время шага 1 возникнет исключение, шаг 2 никогда не будет выполнен.

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

0 голосов
/ 16 февраля 2011

Вот мои предложения

  1. Добавьте правильную обработку для публичного retrieveDocuments (NIST, multipleRetrieveMap) метода, чтобы обеспечить передачу правильных параметров в ваш метод,В нем будут рассмотрены исключения, специально относящиеся к VerboseIllegalArgumentException проверка / обработка параметра должна быть выполнена до передачи параметров в метод retrieveDocuments .Я боюсь, что если вы встретите исключение, вы больше не сможете получить свой объект по причине, указанной в предыдущих постерах Невозможно как перехватить исключение из метода, так и получить возвращаемое значение. , поэтому правильная проверка и обработка очень важны.
  2. После определения причины вашего исключения определите / создайте свои собственные исключения.Это сэкономит вам много времени и головной боли в будущем.
0 голосов
/ 16 февраля 2011

Ваша проблема возникает из-за того, что метид делает слишком много.Он одновременно получает RetrieveDocumentSetImpl и пытается использовать его.

RetrieveDocumentSetImpl myXDSConsumerRequestHandler = 
        new RetrieveDocumentSetImpl(repoURL);
myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);
return myXDSConsumerRequestHandler;

Разделите это на два метода:

RetrieveDocumentSetImpl myXDSConsumerRequestHandler = 
        new RetrieveDocumentSetImpl(repoURL);
return myXDSConsumerRequestHandler;

, которые либо возвращают обработчик, либо завершаются ошибкой, генерируя исключение, и

 myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);

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

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