2012-11-01 5 views
2

static final String 필드를하고 난 반사를 사용하여 값이 그래서 이런 방법을 만들어 싶어 : 값을 반환 할 때 난 항상 NPE를받을 이유가 단순히 이해하지반사를 사용하는이 방법이 왜 npe를 던집니까?

public String getLogoSrc(final String provider) { 
    if (provider.equals(StringUtils.EMPTY)) { 
     return StringUtils.EMPTY; 
    } 

    logger.info("---provider is: "+provider); 

    for (Field f : ConstantsBean.class.getDeclaredFields()) { 
     f.setAccessible(true); 
     if (f.getName().contains(provider.toUpperCase().replace(" ", "_"))) { 
      try { 
       return f.get(null) != null? f.get(null).toString() : ""; 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    return StringUtils.EMPTY; 
} 

을 :

return f.get(null) != null? f.get(null).toString() : "";

예외는 다음과 같습니다

java.lang.NullPointerException 
     at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl 
.java:36) 
     at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccess 
orImpl.java:18) 
     at java.lang.reflect.Field.get(Field.java:358) 
     at com.gravitant.cloud.common.jsf.core.beans.ConstantsBean.getLogoSrc(Co 
nstantsBean.java:195) 

어떤 단서?

+0

NPE 스택 트레이스를 표시 할 수 있습니까? –

답변

3

필드에 액세스하기 전에 필드를 인쇄하십시오. 난 당신이 아닌 정적 필드에 액세스하려고 의심하고 field.get()에 null을 전달 따라서 허용되지 않습니다.

+0

당신 말이 맞아요.나는 조건과 일치하는 정적 필드도 가지지 않고, get (null)의 전달과 함께 예외를 던졌습니다. 해결책은'get (null) '을 멈추지 않고 필드의 유형을 내 정적 필드 유형으로 검사하는 것이 었습니다. –

+2

@CristianBoariu static인지 확인하십시오 : if (java.lang.reflect.Modifier.isStatic (f.getModifiers()))' – maba

+0

@maba이 검사는 더 좋습니다. –

3

지정된 obj 인수가 null의 경우, 메소드는 NullPointerException이 발생 here

get(Object obj)

참조하십시오.

2

지정한 개체로 null을 전달하고 있습니다. 즉, 당신은이 일을하고 있습니다 :

null.fieldname 

당신은 당신의 분야를 원하는 객체에 참조에 전달해야합니다. 해당 필드 개체는 특정 개체의 필드가 아닌 일반 필드를 나타냅니다.

리플렉션을 통한 방법에도 동일하게 적용됩니다. 에 적용 할 개체 참조를 전달해야합니다.

0

당신은

매개 변수와 field.get (OBJ)를 호출 할 때 : OBJ - 객체 표현 된 필드의 값이

반환 추출해내는 : 표현 된 값을 오브젝트 obj의 필드; 원시 값이

반환하기 전에 적절한 객체에 싸여되는 것은 예외 : IllegalAccessException을 - 기본이되는 필드에 액세스 할 수없는 경우.

IllegalArgumentException - 지정된 객체가 기본 필드 (또는 하위 클래스 또는 그 구현 자)를 선언하는 클래스 또는 인터페이스의 인스턴스가 아닌 경우.

NullPointerException - 지정된 객체가 null이며 필드가 인스턴스 필드 인 경우.

ExceptionInInitializerError -이 방법으로 유발 된 초기화가 실패한 경우.

관련 문제