2017-05-16 31 views
-2

私は(setterを介して)オブジェクトを別のクラスに渡して後で何かを実行しようとしていますが、 。渡されたオブジェクトのメソッドが呼び出されたときに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); 
} 

EDIT:スタックトレース

5月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 (WebAppInterface.java:164) (アンドロイド。 :95) とandroid.os.Looper.loop(Looper.java:145) とandroid.app.ActivityThread.main(ActivityThread.java:6934) at java.lang.reflect.Method.invoke(ネイティブメソッド) at java。 com.android.internal.os.ZygoteInitの$ lang.reflect.Method.invoke(Method.java:372) (WebView、 "setWinsLosses"、tierSolo.getWins()、tierSolo.getLosses()); WebAppInterface.java:164 - callJavaScript(webView、 "setWinsLosses"、tierSolo.getWins()、tierSolo.getLosses());

+1

実際にスタックトレースを表示することをお勧めします... – jingx

+0

スタックトレースを追加 –

+2

'dbFlex.getTier(summoner.getSummonerId());'が 'null'を返す可能性を考えましたか? – Zircon

答えて

1

NPEは、非同期に実行される可能性がある実行可能ファイルの内部にスローされます。 setterがパラメータnullで呼び出されないことを確認して、tierFlexの設定を解除します。 最終決定することをお勧めします。しかし、これにはいくつかの追加のリファクタリングが必要な場合があります。

関連する問題