2

に私はオールウェイズこのjava.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference エラーが発生します。私は他の答えを見ましたが、私はそれらの答えを使用する方法を理解していない、私はアクティビティによる呼び出しがないので、文脈とのいくつかの問題があることを理解したので、私はまた成功なしでActivityコンテキストを渡そうとしました... は、これは私のコードです:getApplicationContext()はnullオブジェクト参照

EDIT 私はすでにあなたの答えをしたとit'sntが働いていたので、私はit'sntソリューションと思ったbecuase私はこれを削除しました。あなたの答えに私は(MySingletonクラスまでの距離クラス>にparmerterなどのコンテキストで...)コード

public class MainActivity extends AppCompatActivity { 

    private Button b; 
    private TextView t; 
    private LocationManager locationManager; 
    private LocationListener listener; 


    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     t = (TextView) findViewById(R.id.textView); 
     b = (Button) findViewById(R.id.button); 

     locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 


     listener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       Log.d("Co", "onLocationChanged"); 
       Distance distance=new Distance(); 
       t.setText("\n " + location.getLongitude() + " " + location.getLatitude()+"\n "+distance.getDistance(location)); 

       Location l2=new Location(""); 

       //float distance=location.distanceTo(l2); 
       Log.d("Co", String.valueOf(distance)); 
      } 

      @Override 
      public void onStatusChanged(String s, int i, Bundle bundle) { 

      } 

      @Override 
      public void onProviderEnabled(String s) { 

      } 

      @Override 
      public void onProviderDisabled(String s) { 

       Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(i); 
      } 
     }; 

     configure_button(); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode){ 
      case 10: { 
       configure_button(); 
       Log.d("Co", "premmsioenChecks"); 

      } 
      break; 
      default: 
       break; 
     } 
    } 

    public void configure_button(){ 
     // first check for permissions 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET} 
         ,10); 
       Log.d("Co", "premmsioen"); 

      } 
      return; 
     } 
     // this code won't execute IF permissions are not allowed, because in the line above there is return statement. 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //noinspection MissingPermission 


       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); 
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener); 
       Log.d("Co", "onClick"); 
       Location l2=new Location(""); 


      } 
     }); 
    } 

} 

パブリッククラスの距離{

static String url = ""; 
static String result=""; 

public String getDistance(Location location,Context context) { 

    Log.d("app","getDistance"); 






      String origins=location.getLatitude()+","+location.getLongitude(); 

      url="https://maps.googleapis.com/maps/api/distancematrix/json?&origins="+origins+"&destinations="+destinations; 
      Log.d("URL",url); 
      JsonObjectRequest jsObjRequest = new JsonObjectRequest 

        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

         @Override 
         public void onResponse(JSONObject response) { 
          Log.d("app","onRespone"); 

          String distance=getText(response); 
          if (distance.contains("Error")) { 
           result=distance; 
           return; 
          } 
          else { 
           if (distance.contains("km")) { 
            int meters = Integer.parseInt(distance.replaceAll("[\\D]", "")) * 1000; 
            result= "The distance is " + meters + " meters"; 
            return; 
           } 
           Log.d("7", String.valueOf(Integer.parseInt(distance.replaceAll("[\\D]", "")))); 

           result= "The distance is " + distance; 
          } 



         } 
        }, new Response.ErrorListener() { 

         @Override 
         public void onErrorResponse(VolleyError error) { 
          Log.d("app","Error Respone"); 

         } 
        } 
        ); 
      MySingleton.getInstance(context).addToRequestque(jsObjRequest); 
    return result; 
     } 




public String getText(JSONObject response) 
{ 
    String text=""; 
    try { 

     JSONArray rows = response.getJSONArray("rows"); 
     Log.d("1", rows.toString()); 
     if(rows.toString().contains("[]")) return text="Error"; 
     JSONObject elements = rows.getJSONObject(0); 
     Log.d("2", elements.toString()); 
     rows = elements.getJSONArray("elements"); 
     Log.d("3", rows.toString()); 
     elements = rows.getJSONObject(0); 
     Log.d("4", elements.toString()); 
     Log.d("Error1","Error is @"+elements.getString("status")); 
     if(elements.getString("status").contains("OK")) 
     { 
      JSONObject d = elements.getJSONObject("distance"); 
      Log.d("5", d.toString()); 
      text = d.getString("text"); 
     } 
     else { 
      Log.d("Error2", elements.getString("status")); 
      text = "Error-" + elements.getString("status"); 
     } 

    } 
    catch (JSONException e) 
    { 
     text="Some error ocuerd"; 
    } 
    return text; 
} 

}

public class MySingleton { 
    private static MySingleton mInstance; 
    private RequestQueue requestQueue; 
    public static Context mCtx; 
    private MySingleton(Context context) 
    { 
     mCtx=context; 
     requestQueue= getRequestQueue(); 
    } 

    public RequestQueue getRequestQueue() { 
     if(requestQueue==null) { 
      requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); 
     } 
     return requestQueue; 
    } 
    public static synchronized MySingleton getInstance(Context context) 
    { 
     if(mInstance==null) 
     { 
      mInstance=new MySingleton(context); 
     } 
     return mInstance; 
    } 
    public <T> void addToRequestque(Request<T> request) 
    { 
     requestQueue.add(request); 
    } 

} 
を更新DUE

これはlogcat

06-24 16:19:26.771 25300-25300/com.example.elicahi.gateor D/Co: onClick 
06-24 16:19:27.556 25300-25300/com.example.elicahi.gateor D/Co: onLocationChanged 

06-24 16:19:27.579 25300-25300/com.example.elicahi.gateor D/AndroidRuntime: Shutting down VM 
06-24 16:19:27.579 25300-25300/com.example.elicahi.gateor E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.elicahi.gateor, PID: 25300 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 
                       at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:107) 
                       at com.example.elicahi.gateor.MySingleton.getRequestQueue(MySingleton.java:24) 
                       at com.example.elicahi.gateor.MySingleton.<init>(MySingleton.java:19) 
                       at com.example.elicahi.gateor.MySingleton.getInstance(MySingleton.java:32) 
                       at com.example.elicahi.gateor.Distance.getDistance(Distance.java:79) 
                       at com.example.elicahi.gateor.MainActivity$1.onLocationChanged(MainActivity.java:54) 
                       at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:285) 
                       at android.location.LocationManager$ListenerTransport.-wrap0(LocationManager.java) 
                       at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:230) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5417) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

'getRequestQueue(MySingleton.java:24)'これをチェックしてください。 –

+0

この行の問題 'requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());'あなたの 'mCtx'がヌルです –

+0

私はこれを理解していますので、私はMainActivty ContectをMySingletonに渡しましたが、 – user5209063

答えて

5
です。

がランダムにあなたはそれがコンパイラエラーをクリアすることを考えるという理由だけで、クラスを拡張しないでください。ここでは有効なApplicationサブクラスがなく、正しく使用していません。

ステップ#1:Distanceからextends Applicationを削除します。

ステップ#2:パラメータとしてContextを取り、それがMySingleton

ステップ#3であることを使用していgetDistance()持っている:Context

+0

私はすでにそれをしましたが、ここで自分のコードから削除しました。とにかく、私はこのエイジンを試しましたが、同じエラーが発生しました – user5209063

+0

ねえ、私のコードを更新しました、あなたが私に答えたように...問題は何ですか?私はまだ同じエラーを受け取ります – user5209063

+0

@ user5209063: 'null 'を' MySingleton'コンストラクタに渡す方法を決定する必要があります。 – CommonsWare

-2

は以前のようにそれがそうであるようにgetDistance()MainActivityパスgetApplicationContext()を持っています答えは(CommonsWare)といいます。

Context context; // before onCreate in MainActivity 

context = getApplicationContext(); // in onCreate in MainActivity 
+0

nullでないかもしれないフィールドとして宣言するのではなく、パラメータとして渡すほうがはるかに優れています。これは本当に何も追加しません。 –

関連する問題