Null Pointer Exception that throws force when trying to start multiple threads

I am trying to start a service in the background that sends text messages about the location of the phone. In the service I use a timer. The code that sends the messages works correctly, but when I try to paste the code to find the location of users, I always encounter errors.

I tried to call a new thread and used looper, but now I get a nullpointer exception that points to these two lines of code:

sendSmsMessage(); 

and inside this method:

 if (coordinates.equals(null) || coordinates.equals("") || coordinates == null || coordinates == ""){ coordinates = "Could Not Receive Location"; } 

So, the question I ask is why this error occurs? If you could help me, that would be very grateful. And if I just miss something very simple, please indicate this. Thanks!

Here is the code:

  public class MessageService extends Service{ int counter = 0; private Timer timer = new Timer(); public String textTime, phoneNumber; public int updateInterval; int lat, lng; String coordinates, latitude, longitude; LocationManager locationManager; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId){ //receives the intent extras from the calling intent textTime = intent.getStringExtra("textTime"); phoneNumber = intent.getStringExtra("phone"); phoneNumber = "5556"; //the following if statement has to do with transferring the string textTime into a number that can be used if (textTime.equals("15 Minutes")) { updateInterval = (15 * (60000)); }else if (textTime.equals("30 Minutes")) { updateInterval = (30 * (60000)); }else if (textTime.equals("1 Hour")){ updateInterval = (60 * (60000)); }else { updateInterval = (15 * (60000)); } locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); new Thread(){ public void run(){ Looper.prepare(); // Define a listener that responds to location updates LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { // Called when a new location is found by the network location provider. //makeUseOfNewLocation(location); lat = (int) (location.getLatitude() * 1E6); lng = (int) (location.getLongitude() * 1E6); latitude = Integer.toString(lat); longitude = Integer.toString(lng); coordinates = "Coordinates: " + latitude + ", " + longitude + ". Latitude: " + latitude + " Longitude: " + longitude + ". Respond 'END' to stop texts."; } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; Looper.loop(); if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); }else{ locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); } } }.start(); //the following method should use a timer to send a sms message in a timed interval. It also should implement using a different thread doSomethingRepeatedly(); return START_STICKY; } public void doSomethingRepeatedly(){ timer.scheduleAtFixedRate(new TimerTask() { public void run() { //the following code should be what is done repeatedly //Log.d("MessageService", String.valueOf(++counter)); sendSmsMessage(); } }, 0, updateInterval); } //the following code handles sending the text message public void sendSmsMessage(){ SmsManager sms = SmsManager.getDefault(); if (coordinates.equals(null) || coordinates.equals("") || coordinates == null || coordinates == ""){ coordinates = "Could Not Receive Location"; } sms.sendTextMessage(phoneNumber, null, "test" , null, null); } public void onDestroy() { super.onDestroy(); if (timer != null) { timer.cancel(); } } }//end of service 

And here is the output of logcat:

  10-19 20:23:28.096: E/AndroidRuntime(944): FATAL EXCEPTION: Timer-0 10-19 20:23:28.096: E/AndroidRuntime(944): java.lang.NullPointerException 10-19 20:23:28.096: E/AndroidRuntime(944): at com.app.MessageService.sendSmsMessage(MessageService.java:113) 10-19 20:23:28.096: E/AndroidRuntime(944): at com.app.MessageService$2.run(MessageService.java:105) 10-19 20:23:28.096: E/AndroidRuntime(944): at java.util.Timer$TimerImpl.run(Timer.java:284) 
0
source share
2 answers

You need to replace

 coordinates.equals(null) 

with

 coordinates == null 

since the first one will never evaluate to true , it will throw a NullPointerException() every time the coordinates are null .

+3
source

If your coordinates is zero, then the very first condition oordinates.equals(null) will oordinates.equals(null) NullPointerException .

In addition, I have one more observation. Comparing coordinates == "" useless since you are already using it correctly, i.e. Codes.equals ("").

Change your if to

 if (coordinates.equals(null) || coordinates.equals("") || coordinates == null || coordinates == ""){ coordinates = "Could Not Receive Location"; } 

to

 if (coordinates == null || coordinates.equals("")){ coordinates = "Could Not Receive Location"; } 
+1
source

Source: https://habr.com/ru/post/1440892/


All Articles