[ 
https://issues.apache.org/jira/browse/UIMA-4919?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jose Tomas Atria updated UIMA-4919:
-----------------------------------
    Description: 
org.apache.uima.fit.internal.ReflectionUtil.getFields( Class<? extends 
Resource> clz ) throws a NullPointerException when the given class object 
represents and interface class on the while test on line 59 because the call to 
java.lang.Class.getSuperclass() inside the while loop on line 62 returns null 
as per the [documented 
behaviour|https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getSuperclass--]:
 "(getSuperClass()) returns the Class representing the superclass of the entity 
(class, interface, primitive type or void) represented by this Class. *If this 
Class represents either the Object class, an interface, a primitive type, or 
void, then null is returned*.", here:

{code}
  public static List<Field> getFields(final Class<?> aClass) {
    Class<?> cls = aClass;
    final List<Field> fields = new ArrayList<Field>();
    while (!cls.equals(Object.class)) { // <- THROWS NPE.
      final Field[] flds = cls.getDeclaredFields();
      fields.addAll(Arrays.asList(flds));
      cls = cls.getSuperclass(); // <- RETURNS NULL
    }
    return fields;
  }
{code}

This situation can occur e.g. when doing:

{code}
Class<? extends Resource> api = f.getAnnotation( ExternalResource.class ).api();
ReflectionUtil.getFields( api ) // <- throws NPE if api is an interface, i.e. 
always.
{code}

  was:
org.apache.uima.fit.internal.ReflectionUtil.getFields( Class<? extends 
Resource> clz ) throws a NullPointerException when the given class object 
represents and interface class on the while test on line 59 because 
java.lang.Class.getSuperclass() call inside the while loop on line 62 returns 
null as per the [documented 
behaviour|https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getSuperclass--]:
 "(getSuperClass()) returns the Class representing the superclass of the entity 
(class, interface, primitive type or void) represented by this Class. *If this 
Class represents either the Object class, an interface, a primitive type, or 
void, then null is returned*.", here:

{code}
  public static List<Field> getFields(final Class<?> aClass) {
    Class<?> cls = aClass;
    final List<Field> fields = new ArrayList<Field>();
    while (!cls.equals(Object.class)) { // <- THROWS NPE.
      final Field[] flds = cls.getDeclaredFields();
      fields.addAll(Arrays.asList(flds));
      cls = cls.getSuperclass(); // <- RETURNS NULL
    }
    return fields;
  }
{code}

This situation can occur e.g. when doing:

{code}
Class<? extends Resource> api = f.getAnnotation( ExternalResource.class ).api();
ReflectionUtil.getFields( api ) // <- throws NPE if api is an interface, i.e. 
always.
{code}


> NPE when calling org.apache.uima.fit.internal.ReflectionUtil.getFields( 
> Class<? extends Resource> clz ) on interface class.
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: UIMA-4919
>                 URL: https://issues.apache.org/jira/browse/UIMA-4919
>             Project: UIMA
>          Issue Type: Bug
>          Components: uimaFIT
>    Affects Versions: 2.2.0uimaFIT
>         Environment: JDK: OpenJDK Runtime Environment (build 
> 1.8.0_03-Ubuntu-8u77-b03-3ubuntu3-b03)
> OS: Ubuntu 16.04 LTS (Xenial Xerus)
>            Reporter: Jose Tomas Atria
>            Priority: Trivial
>         Attachments: UIMA-4919.patch
>
>
> org.apache.uima.fit.internal.ReflectionUtil.getFields( Class<? extends 
> Resource> clz ) throws a NullPointerException when the given class object 
> represents and interface class on the while test on line 59 because the call 
> to java.lang.Class.getSuperclass() inside the while loop on line 62 returns 
> null as per the [documented 
> behaviour|https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getSuperclass--]:
>  "(getSuperClass()) returns the Class representing the superclass of the 
> entity (class, interface, primitive type or void) represented by this Class. 
> *If this Class represents either the Object class, an interface, a primitive 
> type, or void, then null is returned*.", here:
> {code}
>   public static List<Field> getFields(final Class<?> aClass) {
>     Class<?> cls = aClass;
>     final List<Field> fields = new ArrayList<Field>();
>     while (!cls.equals(Object.class)) { // <- THROWS NPE.
>       final Field[] flds = cls.getDeclaredFields();
>       fields.addAll(Arrays.asList(flds));
>       cls = cls.getSuperclass(); // <- RETURNS NULL
>     }
>     return fields;
>   }
> {code}
> This situation can occur e.g. when doing:
> {code}
> Class<? extends Resource> api = f.getAnnotation( ExternalResource.class 
> ).api();
> ReflectionUtil.getFields( api ) // <- throws NPE if api is an interface, i.e. 
> always.
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to