diff --git a/docs/pages/pmd/rules/java/errorprone.md b/docs/pages/pmd/rules/java/errorprone.md index 98ca28c032..173243fa7a 100644 --- a/docs/pages/pmd/rules/java/errorprone.md +++ b/docs/pages/pmd/rules/java/errorprone.md @@ -2790,7 +2790,7 @@ Avoid returning from a finally block, this can discard exceptions. **This rule is defined by the following XPath expression:** ``` xpath -//FinallyStatement//ReturnStatement +//FinallyStatement//ReturnStatement except //FinallyStatement//(MethodDeclaration|LambdaExpression)//ReturnStatement ``` **Example(s):** diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index d84371b973..74549e2297 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -18,11 +18,14 @@ This is a {{ site.pmd.release_type }} release. * java-bestpractices * [#658](https://github.com/pmd/pmd/issues/658): \[java] OneDeclarationPerLine: False positive for loops +* java-errorprone + * [#1035](https://github.com/pmd/pmd/issues/1035): \[java] ReturnFromFinallyBlock: False positive on lambda expression in finally block ### API Changes ### External Contributions +* [#1503](https://github.com/pmd/pmd/pull/1503): \[java] Fix for ReturnFromFinallyBlock false-positives - [RishabhDeep Singh](https://github.com/rishabhdeepsingh) * [#1516](https://github.com/pmd/pmd/pull/1516): \[java] OneDeclarationPerLine: Don't report multiple variables in a for statement. - [Kris Scheibe](https://github.com/kris-scheibe) * [#1521](https://github.com/pmd/pmd/pull/1521): \[java] Upgrade to ASM7 for JDK 11 support - [Mark Pritchard](https://github.com/markpritchard) diff --git a/pmd-java/src/main/resources/category/java/errorprone.xml b/pmd-java/src/main/resources/category/java/errorprone.xml index 93930f8694..bad84763b5 100644 --- a/pmd-java/src/main/resources/category/java/errorprone.xml +++ b/pmd-java/src/main/resources/category/java/errorprone.xml @@ -2666,8 +2666,9 @@ Avoid returning from a finally block, this can discard exceptions. 3 + - //FinallyStatement//ReturnStatement + //FinallyStatement//ReturnStatement except //FinallyStatement//(MethodDeclaration|LambdaExpression)//ReturnStatement diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnFromFinallyBlock.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnFromFinallyBlock.xml index 6a0c3a8795..29eb774bb7 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnFromFinallyBlock.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnFromFinallyBlock.xml @@ -4,9 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd"> - + throw exception but return from finally 1 - + lots of returns 1 - + ok 0 + + #1035 [java] ReturnFromFinallyBlock: False positive on lambda expression in finally block + 0 + + + + Return from Lambda in Finally + 0 + untracked = serviceExecutionTracker.untrackMatchingEntries(e -> { + ServiceExecutionIdentifiers ids = e.getIdentifiers(); + Long execBqiId = (ids == null) ? null : ids.getBqiId(); + return Objects.equals(bqiId, execBqiId); + }); + untracked.forEach(e -> logger.info("overwriteLastBqi(bqId={}, bqiId={}) untracked {}", bqId, bqiId, e)); + } + } +} + ]]> + + + return from a lambda should not cause issues + 0 + { return i + 1; }).forEach(i -> System.out.println(i)); + } + } +} + ]]> + + + Return in finally should give error but not in lambda + 1 + { return i + 1; }).forEach(i -> System.out.println(i)); + return "foo"; + } + } +} + ]]> + + + Return from anonyous class should not give any error + 0 + () { + @Override + public Integer apply(Integer i) { + return i + 1; + } + }).forEach(i -> System.out.println(i)); + } + } +} + ]]> +