2

내 앱을 실행하는 동안 나는 항상 이것을 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 오류가 발생합니다. 다른 답변을 보았지만 그 대답을 사용하는 방법을 이해하지 못했기 때문에 활동에 의한 호출이 없기 때문에 컨텍스트에 문제가 있다는 것을 이해했습니다. 그래서 성공없이 Activity 컨텍스트를 전달하려고했습니다 ... 이 내 코드입니다 :null 객체 참조에서 getApplicationContext()

편집 이미 답을했고 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); 
    } 

} 
업데이트 인해

이것은 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'가 null입니다. –

+0

이것이 이해되었으므로 MainActivty 컨텍트를 MySingleton으로 전달했지만 여전히 같은 오류가 발생합니다 ... – user5209063

답변

5
입니다.

클래스를 무작위로 확장하지 마십시오. 컴파일러 오류를 해결한다고 생각하기 때문입니다. 여기에 유효한 Application 하위 클래스가 없으므로 제대로 사용하지 않는 것입니다.

# 1 : extends ApplicationDistance에서 제거하십시오.

단계 # 2 : 이전처럼 수행 Context

+0

이미 그랬지만 여기에서 제 코드에서 삭제했습니다. 어쨌든, 나는이 agin을 시도하고 동일한 오류가 발생했습니다. – user5209063

+0

이봐, 내 코드를 업데이트 했어. 내게 대답 한 것처럼 ... 문제가 뭐지? 난 여전히 같은 오류가 발생합니다 – user5209063

+0

@ user5209063 :'null '을'MySingleton' 생성자에 전달하는 방법을 결정해야합니다. – CommonsWare

-2

getDistance()MainActivity 패스 getApplicationContext() 유무 : getDistance()가 매개 변수로 Context을, 그리고 그것을 MySingleton

3 단계에 있음 사용이 되세요 대답은 (CommonsWare)라고 쓰고 :

Context context; // before onCreate in MainActivity 

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

null 일 수도 있고 아닐 수도있는 필드로 선언하는 것이 아니라 매개 변수로 전달하는 것이 훨씬 낫습니다. 이것은 실제로 아무것도 추가하지 않을 것입니다. –