I am making an app which will display the images of celebrities and 4 names out of which one is correct.
I have added a button "change" to change the celebrity in the image, but on pressing that button my app is crashing showing null java.lang.null pointer exception.
I have the the code for loading the image and four names in the oncreate method which loads the image and four names when the app is first started, but on pressing the button when the function is invoked , error is generated although i have that same code in it.
public class MainActivity extends AppCompatActivity {
//declaring all the widgets to be used
Bitmap celebimg;
Random rand;
ImageView img;
Button btn0, btn1, btn2, btn3;
int optionnum, imgnum;
ArrayList<String> celebnames = new ArrayList<String>();
ArrayList<String> celebimages = new ArrayList<String>();
ArrayList<String> buttonoptions = new ArrayList<String>();
//Invoked when one out of the four options is clicked
public void row(View view) {
if (view.getTag().toString().equals(Integer.toString(optionnum))){
Toast.makeText(this, "correct Answer", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "wrong Answer, It was" +
celebnames.get(imgnum), Toast.LENGTH_SHORT).show();
}
}
//Class for downloading of image
public class Imagedownload extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... strings) {
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
Bitmap myimage = BitmapFactory.decodeStream(in);
return myimage;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
/**
* Class for downloading the website html code
*/
public class Download extends AsyncTask<String, Void, String > {
@Override
protected String doInBackground(String... strings) {
String result = "";
URL url;
HttpURLConnection connection = null;
try {
url = new URL(strings[0]);
connection = (HttpURLConnection)url.openConnection();
InputStream input = connection.getInputStream();
InputStreamReader reader = new InputStreamReader(input);
int data = reader.read();
while(data != -1) {
char current = (char)data;
result += current;
data = reader.read();
}
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Code to execute when the change button is clicked
public void change(View view) {
rand = new Random();
imgnum = rand.nextInt(celebimages.size());
Imagedownload image = new Imagedownload();
try {
celebimg = image.execute(celebimages.get(imgnum)).get();
if (celebimg == null)
Log.i("its", "null douchebag");
img.setImageBitmap(celebimg);
} catch (InterruptedException e) {
if (celebimg == null)
Log.i("its", "null douchebag");
e.printStackTrace();
} catch (ExecutionException e) {
if (celebimg == null)
Log.i("its", "null douchebag");
e.printStackTrace();
}
optionnum = rand.nextInt(4);
for(int i = 0;i < 4;i++){
if(i == optionnum)
buttonoptions.add(celebnames.get(imgnum));
else {
int random = rand.nextInt(celebnames.size());
while (celebnames.get(imgnum) == celebnames.get(random)){
random = rand.nextInt(celebnames.size());
}
buttonoptions.add(celebnames.get(random));
}
}
btn0.setText(buttonoptions.get(0));
btn1.setText(buttonoptions.get(1));
btn2.setText(buttonoptions.get(2));
btn3.setText(buttonoptions.get(3));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView img = (ImageView)findViewById(R.id.celeb);
btn0 = (Button)findViewById(R.id.btn0);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
btn3 = (Button)findViewById(R.id.btn3);
String data = "";
Download load = new Download();
try {
data = load.execute("http://www.posh24.se/kandisar").get();
String[] splitdata = data.split("<div class=\"title\">Lista:</div>");
// seperating out the required img src from the html code
Pattern p = Pattern.compile("src=\"(.*?)\"");
Matcher M = p.matcher(splitdata[1]);
while (M.find()){
//adding all the img src values to celebimages arraylist
celebimages.add(M.group(1));
}
Pattern pi = Pattern.compile("alt=\"(.*?)\"");
Matcher Mi = pi.matcher(splitdata[1]);
while (Mi.find()) {
// adding all the alt values to celebnames arraylist
celebnames.add(Mi.group(1));
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Random rand = new Random();
imgnum = rand.nextInt(celebimages.size());
Imagedownload image = new Imagedownload();
Bitmap celebimg;
try {
//downloading the image from stored img src values from celebimages
//arraylist
celebimg = image.execute(celebimages.get(imgnum)).get();
img.setImageBitmap(celebimg);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//Setting the correct value in one button and random values in other
//three
optionnum = rand.nextInt(4);
for(int i = 0;i < 4;i++){
if(i == optionnum)
buttonoptions.add(celebnames.get(imgnum));
else {
int random = rand.nextInt(85);
while (celebnames.get(imgnum) == celebnames.get(random)){
random = rand.nextInt(celebnames.size());
}
buttonoptions.add(celebnames.get(random));
}
}
btn0.setText(buttonoptions.get(0));
btn1.setText(buttonoptions.get(1));
btn2.setText(buttonoptions.get(2));
btn3.setText(buttonoptions.get(3));
}
Error:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference