如何在lambda表达式(JAVA)中使用try-catch?

如何在lambda表达式(JAVA)中使用try-catch?,java,class,lambda,expression,optional,Java,Class,Lambda,Expression,Optional,我必须使用lambda表达式。在本例中,try块使用输入字符串创建一个JSON对象。但是我必须实现这一点,如果创建不起作用,它应该返回一个可选的.Empty(),而不是null。 我该怎么做? 在当前情况下,工作流将停止,直到捕获发生。因此,其他字符串被忽略 private Optional<JSONObject> testFile (Optional<String> jsonFileContent) { try { return jso

我必须使用lambda表达式。在本例中,try块使用输入字符串创建一个JSON对象。但是我必须实现这一点,如果创建不起作用,它应该返回一个
可选的.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;
    }
}
private可选测试文件(可选jsonFileContent)
{
尝试
{
返回jsonFileContent.map(fileContent->newjsonobject(jsonFileContent));//这个lambda表达式需要扩展
}
捕获(例外e)
{
返回null;
}
}

您可以编写一个方法来创建 新的JSONObject(jsonFileContent)

您将在try-with-catch中将逻辑封装在方法中,如果发生异常,将返回null

实际上,在调用map之后,您可以先执行filter,然后执行findFirst,它为null,并作为findFirst返回可选值 将根据需要返回一个空的可选项

private可选测试文件(可选jsonFileContent)
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();
    }
}
{ 试一试{ 返回jsonFileContent.map(fileContent->a(fileContent)); } 捕获(例外一) { 返回null; } 可选a(可选jsonFileContent){ 试一试{ 返回新的JSONObject(jsonFileContent);//此lambda表达式需要扩展 }捕获(例外e){ 返回可选的.empty(); } }
这不是处理错误的好方法,因为:

  • 如果出现问题,您和调用代码的任何人都不知道操作失败的原因
  • 你会告诉最终用户什么?“出了点问题,但我们不知道是什么,所以你对此无能为力,也不要费心告诉我们”
如果您不确定处理异常的最佳方法,请不要捕获异常。相反,请声明抛出异常的方法,并让准备处理异常的调用方处理异常。例如,用户界面可能捕获异常并向最终用户提供其某些详细信息

private Optional<JSONObject> testFile(Optional<String> jsonFileContent)
throws JSONException
{
    if (jsonFileContent.isPresent())
    {
        return Optional.of(new JSONObject(jsonFileContent.get()));
    }
    else
    {
        return Optional.empty();
    }
}
private可选测试文件(可选jsonFileContent)
抛出JSONException
{
if(jsonFileContent.isPresent())
{
返回可选的.of(新的JSONObject(jsonFileContent.get());
}
其他的
{
返回可选的.empty();
}
}
关于捕获异常的注意事项:

Java SE中从RuntimeException派生的大多数类都表示程序员错误。示例如下:

  • NullPointerException
  • IndexOutOfBoundsException
  • 非法辩论例外
发生这些情况时,它们表明您的程序逻辑已损坏。您不应该从中恢复;您应该注意它们并修复负责的代码。捕获它们并抑制它们不会使您的程序正常工作

此类异常不应被捕获。这也意味着您不应编写
catch(Exception…
catch(RuntimeException…
。如果必须编写
catch
块,则只捕获绝对需要捕获的异常


但是更好的选择是不捕获任何内容,并使用
声明您的方法抛出JSONException

从不从声明为返回
可选的
方法返回
null
,而是返回
可选的.empty()