I am trying to implement a search mechanism on my app and it will show nearby places. I'm following a tutorial on YouTube and I get this error. I don't know how to fix this since it's my first time doing this.
This is the error log
2022-03-26 21:44:00.888 20967-21012/com.example.busticketingapp E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.example.busticketingapp, PID: 20967
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:399)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.InputStream.close()' on a null object reference
at com.example.busticketingapp.DownloadURL.retrieveUrl(DownloadURL.java:36)
at com.example.busticketingapp.FetchData.doInBackground(FetchData.java:28)
at com.example.busticketingapp.FetchData.doInBackground(FetchData.java:16)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
This is my DownloadURL class
This is exactly what is on the youtube tutorial i was following
import android.util.Log;
`import java.io.*;`
`import java.net.HttpURLConnection;`
`import java.net.URL;`
`public class DownloadURL {`
public String retrieveUrl(String myUrl) throws IOException{
String data = "";
HttpURLConnection httpURLConnection = null;
InputStream inputStream = null;
try {
URL url = new URL(myUrl);
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.connect();
inputStream=httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line=bufferedReader.readLine())!=null){
sb.append(line);
}
data = sb.toString();
bufferedReader.close();
}
catch (Exception e){
Log.d("Exception", e.toString());
}
finally {
inputStream.close();
httpURLConnection.disconnect();
}
return data;
}
}
This is FetchData class
This is exactly what is on the youtube tutorial i was following
package com.example.busticketingapp;
`import android.os.AsyncTask;`
`import com.google.android.gms.maps.CameraUpdateFactory;`
`import com.google.android.gms.maps.GoogleMap;`
`import com.google.android.gms.maps.model.LatLng;`
`import com.google.android.gms.maps.model.MarkerOptions;`
`import org.json.JSONArray;`
`import org.json.JSONException;`
`import org.json.JSONObject;`
`import java.io.IOException;`
`public class FetchData extends AsyncTask<Object,String,String> {`
String googlePlacesData;
GoogleMap googleMap;
String url;
@Override
protected String doInBackground(Object... objects) {
try{
googleMap=(GoogleMap) objects[0];
url=(String) objects[1];
DownloadURL downloadURL = new DownloadURL();
googlePlacesData = downloadURL.retrieveUrl(url);
}catch (IOException e){
e.printStackTrace();
}
return googlePlacesData;
}
@Override
protected void onPostExecute(String s) {
try{
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray=jsonObject.getJSONArray("results");
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObject1=jsonArray.getJSONObject(i);
JSONObject getLocation = jsonObject1.getJSONObject("geometry").getJSONObject("location");
String lat = getLocation.getString("lat");
String lng = getLocation.getString("lng");
JSONObject getName = jsonArray.getJSONObject(i);
String name = getName.getString("name");
LatLng latLng = new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.title(name);
markerOptions.position(latLng);
googleMap.addMarker(markerOptions);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,15));
}
}catch (JSONException e){
e.printStackTrace();
}
}
}