From dbe01688656557dfdb1814ac891b491c0544adc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Mart=C3=ADn=20Sotuyo=20Dodero?=
 <juansotuyo@gmail.com>
Date: Tue, 10 Oct 2017 12:08:52 -0300
Subject: [PATCH] [java] Avoid errors upon resolving invalid classes

 - Resolves #328
 - Take the chance to simplify some error handling
(`NoClassDefFoundError` extends `LinkageError`)
---
 .../net/sourceforge/pmd/lang/java/symboltable/TypeSet.java    | 3 +++
 .../pmd/lang/java/typeresolution/ClassTypeResolver.java       | 4 +---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java
index 0bb46bbe36..8fe242bac4 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/TypeSet.java
@@ -532,6 +532,9 @@ public class TypeSet {
                     return resolver.resolve(name);
                 } catch (ClassNotFoundException cnfe) {
                     // ignored, maybe another resolver will find the class
+                } catch (LinkageError le) {
+                    // we found the class, but there is a problem with it (see https://github.com/pmd/pmd/issues/328)
+                    return null;
                 }
             }
         }
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 d2b13a091a..c5206c56bf 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
@@ -1298,8 +1298,6 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter {
                     myType = pmdClassLoader.loadClass(qualifiedName);
                 } catch (ClassNotFoundException e) {
                     myType = processOnDemand(qualifiedName);
-                } catch (NoClassDefFoundError e) {
-                    myType = processOnDemand(qualifiedName);
                 } catch (LinkageError e) {
                     myType = processOnDemand(qualifiedName);
                 }
@@ -1430,7 +1428,7 @@ public class ClassTypeResolver extends JavaParserVisitorAdapter {
                     String strName = anImportDeclaration.getImportedName();
                     String fieldName = strName.substring(strName.lastIndexOf('.') + 1);
 
-                    Class staticClassWithField = loadClass(strPackage);
+                    Class<?> staticClassWithField = loadClass(strPackage);
                     if (staticClassWithField != null) {
                         JavaTypeDefinition typeDef = getFieldType(JavaTypeDefinition.forClass(staticClassWithField),
                                                                   fieldName, currentAcu.getType());