From 30afff46c65d17dd4974f4831b1ea0f0232bdf75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Mart=C3=ADn=20Sotuyo=20Dodero?= Date: Sun, 4 Mar 2018 03:46:05 -0300 Subject: [PATCH] [java] Avoid a NPE in Type Resolution - If a class extends a class that references / extends a missing class, it's possible for the `NoClassDefFoundError` to only rise once we call `isAnonymousClass()` on the `Class`. - For consistency with missing classes, we set the type to null. - Logging such missing classes is still pending #194 --- .../lang/java/typeresolution/ClassTypeResolver.java | 10 ++-------- .../typedefinition/JavaTypeDefinition.java | 7 ++++++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java index 963940043b..a4a5452fc1 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java @@ -204,11 +204,7 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter { if (className != null) { populateClassName(node, className); } - } catch (ClassNotFoundException e) { - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Could not find class " + className + ", due to: " + e); - } - } catch (NoClassDefFoundError e) { + } catch (ClassNotFoundException | NoClassDefFoundError e) { if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Could not find class " + className + ", due to: " + e); } @@ -1344,9 +1340,7 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter { try { pmdClassLoader.loadClass(fullyQualifiedClassName); return true; // Class found - } catch (ClassNotFoundException e) { - return false; - } catch (NoClassDefFoundError e) { + } catch (ClassNotFoundException | NoClassDefFoundError e) { return false; } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java index d1c844671f..542b16728a 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java @@ -62,7 +62,12 @@ public abstract class JavaTypeDefinition implements TypeDefinition { return typeDef; } - final JavaTypeDefinition newDef = new JavaTypeDefinitionSimple(clazz); + final JavaTypeDefinition newDef; + try { + newDef = new JavaTypeDefinitionSimple(clazz); + } catch (final NoClassDefFoundError e) { + return null; // Can happen if a parent class references a class not in classpath + } CLASS_EXACT_TYPE_DEF_CACHE.put(clazz, newDef);