2017-05-16 4 views
-2

(setter를 통해) 객체를 다른 클래스에 전달하려고합니다. 나중에이 객체 메소드를 호출 할 때 null 포인터 예외가 발생합니다. .객체의 메소드가 호출 될 때 null 포인터 예외가 발생합니다.

물론 개체의 값 할당은 setFlexInfo 함수를 호출하는 것보다 빠릅니다.

Tab1Preview.java

DatabaseTierFlex dbFlex = new DatabaseTierFlex(getContext()); 
tier = dbFlex.getTier(summoner.getSummonerId()); 

jsInterface.setTierFlex(tier); // passing object 

jsInterface.callJavaScript(webView, "setServer", summoner.getServer()); 

WebAppInterface.java

private Tier tierFlex; // declaration 
private Context mContext; 
private NestedWebView webView; 

public WebAppInterface(NestedWebView webView, Context c) { 
     this.mContext = c; 
     this.webView = webView; 
    } 


public void setTierFlex(Tier tierFlex) { // Setter 
    this.tierFlex = tierFlex; 
} 


@JavascriptInterface 
public void setFlexInfo() { // method what I'm calling when I click a certain div 

    webView.post(new Runnable() { 
     @Override 
     public void run() { 
      // I'm getting NullPointerException here 
      callJavaScript(webView, "setWinsLosses", tierFlex.getWins(), tierFlex.getLosses()); 
      if (tierFlex.getSeriesTarget() != -1) { 
       callJavaScript(webView, "setPromo", tierFlex.getSeriesTarget(), tierFlex.getSeriesProgress()); 
      } 
      if (tierFlex.isFreshBlood()) { 
       callJavaScript(webView, "setEmblemFreshBlood"); 
      } 
      if (tierFlex.isVeteran()) { 
       callJavaScript(webView, "setEmblemVeteran"); 
      } 
      if (tierFlex.isHotStreak()) { 
       callJavaScript(webView, "setEmblemHotStreak"); 
      } 
     } 
    }); 
} 

public void callJavaScript(WebView view, String methodName, Object... params) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append("javascript:try{"); 
    stringBuilder.append(methodName); 
    stringBuilder.append("("); 
    String separator = ""; 
    for (Object param : params) { 
     stringBuilder.append(separator); 
     separator = ","; 
     if (param instanceof String) { 
      stringBuilder.append("'"); 
     } 
     stringBuilder.append(param); 
     if (param instanceof String) { 
      stringBuilder.append("'"); 
     } 

    } 
    stringBuilder.append(")}catch(error){console.error(error.message);}"); 
    final String call = stringBuilder.toString(); 
    Log.i(TAG, "callJavaScript: call=" + call); 


    view.loadUrl(call); 
} 

편집 : 스택 추적

05-16 22 : 56 : 38.481 27438-27438/COM. example.krulkamyl.accountinfo E/AndroidRuntime : 치명적 예외 : 주 프로세스 : com.example.krulkamyl.accountinfo, PID : 27438 java.lang.NullPointerException : NULL 객체 참조에 가상 메소드 'int com.example.krulkamyl.accountinfo.model.Tier.getWins()'을 호출하려고 시도했습니다. at com.example.krulkamyl.accountinfo.interfaces.WebAppInterface $ 3.run (WebAppInterface.java:164) (android.os.Handler.handleCallback (Handler.java:739) android.os.Handler.dispatchMessage (Handler.java:164) : 95) android.os.Looper.loop (Looper.java:145) at android.app.ActivityThread.main (ActivityThread.java:6934) at java.lang.reflect.Method.invoke (네이티브 메소드) at java. com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1404) at lang.reflect.Method.invoke ZygoteInit.java:1199)

WebAppInterface.java:164 - callJavaScript (webView, "setWinsLosses", tierSolo.getWins(), tierSolo.getLosses());

+1

실제로 스택 추적을 표시하는 것이 좋습니다 ... – jingx

+0

스택 추적 추가 –

+2

'dbFlex.getTier (summoner.getSummonerId());'가 null을 반환 할 가능성을 고려 했습니까? – Zircon

답변

1

비동기 적으로 실행될 수있는 실행 파일 내에서 NPE가 throw됩니다. setter가 매개 변수 null로 호출되지 않아야 tierFlex가 설정 해제됩니다. 최종적으로 작성하는 것이 좋습니다. 그래도 약간의 추가 리팩터링이 필요할 수 있습니다.

관련 문제