简体   繁体   中英

java.lang.nullpointer error in android

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

The problem is because you're creating another variable for the image instead reusing the previous variable:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ImageView img = (ImageView)findViewById(R.id.celeb);

    ...
}

it should be

img = (ImageView)findViewById(R.id.celeb);

The problem usually happens because not using a readable naming convention such as the following:

Bitmap celebimg;
Random rand;
ImageView img;
Button btn0, btn1, btn2, btn3;

Use something like this for class scope variables:

Bitmap mBmpCeleb;
Random mRndSomeId;
ImageView mImvCeleb;
Button mBtnImageOne, mBtnImageTwo, mBtnImageThree, mBtnImageThree;

where the m character is an abbreviation of member which is telling that the variable is member of the class.

Use something like the following for a method scope variable:

ImageView imvCeleb = (ImageView) findViewById(R.id.celeb);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM