Как использовать try catch в лямбда-выражении (JAVA)? - PullRequest
0 голосов
/ 13 ноября 2018

Я должен работать с лямбда-выражениями.В этом случае блок try должен создать объект JSON со строками ввода.Но я должен реализовать это, если создание не работает, оно должно вернуть Optional.Empty() вместо null.Как я могу это сделать ?В текущей ситуации рабочий процесс останавливается, пока не произойдет перехват.Поэтому остальные строки игнорируются.

private Optional<JSONObject> testFile (Optional<String>  jsonFileContent)
{
    try
    {
        return jsonFileContent.map(fileContent -> new JSONObject(jsonFileContent)); // this lambda expression needs to be extended
    }
    catch(Exception e)
    {
        return null;
    }
}

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018
private Optional<JSONObject> testFile (Optional<String>  jsonFileContent)
  {
       try{
            return jsonFileContent.map(fileContent -> a(fileContent));
        }
          catch(Exceptione)
{
     return null;
}
Optional a(Optional<String> jsonFileContent) {
    try{
        return new JSONObject(jsonFileContent); // this lambda expression needs to be extended
    } catch (Exception e) {
        return Optional.empty();
    }
}
0 голосов
/ 13 ноября 2018

Это не хороший способ обработки ошибок, потому что:

  • Если что-то пойдет не так, ни вы, ни кто-либо, кто вызывает ваш код, не поймут, почему операция не удалась.
  • Что вы скажете конечным пользователям?«Что-то пошло не так, но мы понятия не имеем, что, так что вы ничего не можете с этим поделать, и не пытайтесь рассказать нам тоже»?

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

private Optional<JSONObject> testFile(Optional<String> jsonFileContent)
throws JSONException
{
    if (jsonFileContent.isPresent())
    {
        return Optional.of(new JSONObject(jsonFileContent.get()));
    }
    else
    {
        return Optional.empty();
    }
}

Примечание по отлову исключений:

Большинство классов, которые происходят от RuntimeException в JavaSE предназначены для указания ошибок программиста.Примерами могут быть:

  • NullPointerException
  • IndexOutOfBoundsException
  • IllegalArgumentException

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

Такие исключения никогда не должны обнаруживаться.Это также означает, что вы никогда не должны писать catch (Exception …) или catch (RuntimeException …).Если вам нужно написать блок catch, перехватывайте только те исключения, которые вам абсолютно необходимо перехватить.

Но лучшим вариантом будет просто не перехватывать что-либо и объявить свой метод с помощью throws JSONException.

0 голосов
/ 13 ноября 2018

Вы можете написать метод, который бы создавал новый JSONObject (jsonFileContent).

И вы оберните логику в вашем методе в try с catch и вернете ноль, если возникла исключительная ситуация.

На самом деле, после того, как вы вызвали карту, вы можете выполнить filter, а затем findFirst, который имеет значение null и когда findFirst возвращает значение Optional it вернет пустой необязательный, как вы хотели.

...