-1

I get data from website by Jsoup, about 60-70 rows of table and use that to create a ListView with subnames of team members. When I debug it's all ok but from nowhere appears to me NullPointerException. I think my code is good and this should not happen. At the error description I have a statement about skipped frames.

Error:

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
                  at com.example.adam.rozpiskimeczowe.offical.GetDataFromBeachPzps$1.onClick(GetDataFromBeachPzps.java:104)
W/System.err:     at android.view.View.performClick(View.java:6256)
                  at android.view.View$PerformClick.run(View.java:24779)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:180)
                  at android.app.ActivityThread.main(ActivityThread.java:6944)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:853)
I/Choreographer: Skipped 110 frames!  The application may be doing too much work on its main thread.

and my code:

public class GetDataFromBeachPzps extends AppCompatActivity {

    AlertDialog dialog;
    Button btnGetData;
    Document doc;
    String teams;

    //add
    int quantityOfTeam=0;
    ArrayList<String> names;
    CustomAdapter customAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_data_from_beach_pzps);

        //ADD LIST
        final ListView list = findViewById(R.id.getDataListView);
        list.setItemsCanFocus(true);


        //GET DATA FROM WEBSITE
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);


        btnGetData = findViewById(R.id.getDataBtn);


        btnGetData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //Selecja turnieju za pomocą numeru na końcu URL
                try {

                    Connection.Response res = Jsoup.connect("http://beach.pzps.pl/pl/site/login")
                            .data("LoginForm[email]", "adamandrys7@gmail.com", "LoginForm[password]", "66romek6")
                            .method(Connection.Method.POST)
                            .execute();

                    Map<String, String> loginCookies = res.cookies();

                    doc = Jsoup.connect("http://beach.pzps.pl/pl/tournament/793")
                            .cookies(loginCookies)
                            .get();

                    Element innerTable = doc.select(".items tbody").first();
                    Elements  rows = innerTable.select("tr");

                    for(Element row:rows) {
                        Elements cells = row.select("td:eq(4)");
                        /*for (Element cell : cells) {*/
                            //MOŻLIWA ZMIANA DO TURNIEJU TO JEST ZROBIONE PO ZAKOŃCZENIU TURNIEJU
                            teams =cells.text();

                        /*}*/
                        quantityOfTeam++;
                        //convert
                        teams = teams.replaceAll("\\(.*?\\)","");
                        String team1 =teams.split("/")[0];
                        String team2 =teams.split("/")[1];

                        team1 = team1.substring(indexOfFirstCapitalLetter(team1));
                        team2 = team2.substring(indexOfFirstCapitalLetter(team2));

                        team1 = team1.split(" ")[0];
                        team2 = team2.split(" ")[0];


                            names.add(team1);


                            names.add(team2);

                    }



                    customAdapter = new CustomAdapter(getApplicationContext());
                    list.setAdapter(customAdapter);



                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });


    }

    class CustomAdapter extends BaseAdapter {
        private Context context;
        private String[] rValues = new String[quantityOfTeam];

        CustomAdapter(Context context) {
            this.context = context;
        }

        @Override
        public int getViewTypeCount() {
            return getCount();
        }

        @Override
        public int getItemViewType(int position) {
            return position;
        }

        @Override
        public int getCount() {
            return quantityOfTeam;
        }

        @Override
        public String getItem(int position) {
            return names.get(position) +"\n" + names.get(position + quantityOfTeam);
        }


        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            for(int i =0;i<quantityOfTeam;i++){
                rValues[i]="R"+(i+1);
            }
            if (convertView == null) {
                holder = new ViewHolder();

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.brazylian_item_list, null, true);


                holder.editText = convertView.findViewById(R.id.brazItemListEditTextName1);
                holder.editText2 = convertView.findViewById(R.id.brazItemListEditTextName2);
                holder.textView = convertView.findViewById(R.id.brazItemListtextViewR);


                holder.editText.setText(names.get(position));
                holder.editText2.setText(names.get(position+quantityOfTeam));


                convertView.setTag(holder);
            } else {
                // the getTag returns the viewHolder object set as a tag to the view
                holder = (ViewHolder) convertView.getTag();
            }

            holder.textView.setText(rValues[position]);

            holder.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view, boolean b) {
                    if (!b) {
                        names.set(position, holder.editText.getText().toString()) ;

                    }
                }
            });

            holder.editText2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view, boolean b) {
                    if (!b) {
                        names.set(position + quantityOfTeam, holder.editText2.getText().toString());
                    }
                }
            });

            return convertView;
        }

        private class ViewHolder {

            protected EditText editText;
            protected EditText editText2;
            protected TextView textView;

        }

    }

    int indexOfFirstCapitalLetter(String str){
        for(int i=0;i<str.length();i++){
            if(Character.isUpperCase(str.charAt(i))) return i;
        }
        return -1;
    }

}

I don't know what I can do? I was looking on the internet but I did not find anything meaningful :(

Strawberryshrub
  • 3,301
  • 2
  • 11
  • 20
Nicpon
  • 1
  • 2

2 Answers2

0

You did not initialize names. You need to add names = new ArrayList<>(); either as part of the declaration or before you use it in the code. If you want it to only contain the names of the two teams you retrieved, then add that statement just before names.add(team1);.

Leo Aso
  • 11,898
  • 3
  • 25
  • 46
0

skipped frames is irrelevant your question. null object reference error caused by no initializing names.

so firstly:

AlertDialog dialog;
Button btnGetData;
Document doc;
List<String> names = new ArrayList<>(); 

Then:

names.clear(); 
for(Element row:rows) {
navylover
  • 12,383
  • 5
  • 28
  • 41