2016-01-13 3 views
10

私は、たくさんの古いスタイルのループの代わりにJava 8ストリームを使用しています。結果の束を繰り返し、要約統計量を生成します。IntStreamはいつ実際に閉じられますか? SonarQube S2095はIntStreamに対して偽陽性ですか?

​​

注:たとえば、私は上記を示しカウントを行うための他の方法があることを知っています。私は私の質問を説明するためにそれをやっています。

私はJava 3.9プラグインでSonarQube 5.3を使用しています。その構成では、上記のコード行は、私にイカルールS2095の違反を与える:「リソースは閉じなければならない」これは、AutoCloseable(FileInputStreamなど)が開かれたが決して閉じられなかった場合に見られる結果である。

これは私の質問です:ターミナル操作reduceはストリームを閉じますか?すべき?それともイカのルールではこれは偽陽性ですか?

+0

'' 'IntStream'''によって' '' onClose(Runnable closeHandler) ''メソッドが '' '' BaseStream''クラスから継承されていることで修正されるでしょう。このハンドラを使用して、ストリームが閉じられているかどうかを調べることができます。 – saka1029

+0

モニターhttps://jira.sonarsource.com/browse/SONARJAVA-1478 – PaoloC

答えて

8

AutoCloseableインターフェイスがtry-with-resourcesの内部でのみ機能するため、閉じていません。それはAutoCloseableインタフェースjavadocに言ったようしかし、このクローズ操作はIntStreamには全く不要である。しかし

、などjava.util.stream.Streamなどの設備を使用するときに サポートI/Oベースおよび非Iの両方/ Oベースのフォーム、try-with-resources I/O以外のフォームを使用する場合、ブロックは一般的に不要です。

したがってはい S2095はIntStreamに対して偽陽性です。これはうまくいけばSONARJAVA-1478

+0

ストリームが実際に閉じられたときの私の質問はまだ立っています。あなたはイカのルールでこれが偽陽性であると言っていますか?それとも、全体のポイントが間違っていると言っていますか? –

+3

@BobCrossこれは確かに偽陽性です。 'AutoClosable'インターフェースはJava 8で変更されましたが、現在は' AutoClosable'というものが実際にリソースを閉じて閉じることはできません。 – Tunaki

+5

静的解析ではバグは検出されません。バグの可能性があるものを検出し、調べる価値があるかもしれません。この場合、ストリームにはリリースが必要なリソースがないため、それを見てバグではないと判断しました。 –

関連する問題