Fortify最终将错误丢进去

问题描述

我得到以下要点: 错误错误处理:最后扔进去 我没有在finally块内抛出异常,但是仍然显示错误。 请在下面找到代码

catch( IOException | JSONException | URISyntaxException e)
    {
        if(instream == null) {
            throw new  IOException("InputStream not valid");
        }
        return e.getMessage();
    }finally {
        if(instream != null ) {
            instream.close();
        }
        if(urlConnection != null ) {
            urlConnection.disconnect();
        }
    }

解决方法

不,你是:inStream.close()可以扔。

通常,“纠正”警告实际上会使您的代码更糟。这是问题所在:

IF try块引发未捕获的异常

在这种情况下,将执行finally块。假设finally块运行in.close();。特别是如果我们到达这里的全部原因是in已断开连接并开始抛出IOEx,那么这很可能也会抛出IOEx。在finally块中抛出的所有异常都会“覆盖”导致我们出现在此处的异常,并且从该close调用进行的堆栈跟踪的作用远没有这么大。

这很糟糕

我们可以通过将in.close()包装在try { .. } catch (Exception ignore) {}中的finally块中来进行修复。但是然后,另一种情况真的很糟糕:

如果我们“正常”到达这里

输入流有可能完美工作,然后在关闭它时抛出。很长一段时间以来,普遍的看法是“嗯,不管,谁在乎,我得到了我的数据”,但这不是一个明智的主意:如果输入的结尾最终抛出了,那可能意味着您实际上还没有获得所有数据,否则,为什么要这么做呢?因此,现在,无声地吞咽任何异常是一个坏主意,我们希望将其抛出。

在不向后弯曲的情况下,使用布尔值来跟踪我们如何到达finally块并依赖于它,无论是否吞下该异常,不可能正确执行。

因为这是如此棘手,所以请尝试使用资源实际上是正确的并生成所需的样板。

因此,这是REAL解决方案:如果您要在finally块中关闭资源,请不要这样做。请改用try (ResourceType r = new ResourceType()) { ... }语法。

如果您确实无法做到这一点,并且也无法通过创建可自动关闭的包装器来使其工作,例如,如果资源为null,则该包装器将不执行任何操作,那么基本上就被迫告诉您的linter不再对此抱怨。