From 81a72cb43ef77f920732a4db80a7885e129e6a67 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 17 Sep 2020 18:49:21 +0200 Subject: [PATCH] [java] CloseResource: Fix NPE in case of "var" --- docs/pages/release_notes.md | 1 + .../rule/errorprone/CloseResourceRule.java | 4 ++-- .../rule/errorprone/xml/CloseResource.xml | 21 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 2fa8a74515..3c1423c57f 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -32,6 +32,7 @@ AbstractTokenizer and the custom tokenizers of Fortran, Perl and Ruby are deprec * pmd-java * [#2708](https://github.com/pmd/pmd/issues/2708): \[java] False positive FinalFieldCouldBeStatic when using lombok Builder.Default * [#2738](https://github.com/pmd/pmd/issues/2738): \[java] Custom rule with @ExhaustiveEnumSwitch throws NPE + * [#2755](https://github.com/pmd/pmd/issues/2755): \[java] \[6.27.0] Exception applying rule CloseResource on file ... java.lang.NullPointerException * [#2756](https://github.com/pmd/pmd/issues/2756): \[java] TypeTestUtil fails with NPE for anonymous class * [#2759](https://github.com/pmd/pmd/issues/2759): \[java] False positive in UnusedAssignment * [#2767](https://github.com/pmd/pmd/issues/2767): \[java] IndexOutOfBoundsException when parsing an initializer BlockStatement diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java index cf71010a6a..54e31d0b5d 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java @@ -175,7 +175,7 @@ public class CloseResourceRule extends AbstractJavaRule { Map resVars = new HashMap<>(); for (ASTVariableDeclarator var : vars) { TypeNode varType = getTypeOfVariable(var); - if (isResourceTypeOrSubtype(varType)) { + if (varType != null && isResourceTypeOrSubtype(varType)) { resVars.put(var, wrappedResourceTypeOrReturn(var, varType)); } } @@ -189,7 +189,7 @@ public class CloseResourceRule extends AbstractJavaRule { private TypeNode getDeclaredTypeOfVariable(ASTVariableDeclarator var) { ASTLocalVariableDeclaration localVar = (ASTLocalVariableDeclaration) var.getParent(); - return localVar.getTypeNode(); + return localVar.getTypeNode(); // note: can be null, if type is inferred (var) } private TypeNode getRuntimeTypeOfVariable(ASTVariableDeclarator var) { diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml index 440cced230..3dce9a7c49 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/CloseResource.xml @@ -1385,6 +1385,27 @@ public class Foo { } Closeables.close(stream, false); } +} + ]]> + + + + [java] [6.27.0] Exception applying rule CloseResource on file ... java.lang.NullPointerException #2755 + 0 +