Android NullPointerException和跳过110帧

Android NullPointerException和跳过110帧,android,listview,nullpointerexception,jsoup,frames,Android,Listview,Nullpointerexception,Jsoup,Frames,我通过Jsoup从网站上获取数据,大约60-70行表,并使用这些数据创建一个包含团队成员子名称的ListView。当我调试时,一切都正常,但不知从何处出现NullPointerException。我认为我的代码是好的,这不应该发生。在错误描述中,我有一个关于跳过帧的语句 错误: W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.ad

我通过Jsoup从网站上获取数据,大约60-70行表,并使用这些数据创建一个包含团队成员子名称的ListView。当我调试时,一切都正常,但不知从何处出现
NullPointerException
。我认为我的代码是好的,这不应该发生。在错误描述中,我有一个关于跳过帧的语句

错误:

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.
我的代码是:

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;
    }

}
公共类GetDataFromBeachPzps扩展了AppCompatActivity{
警报对话框;
按钮btnGetData;
文件文件;
弦乐队;
//加
int quantityOfTeam=0;
数组列表名称;
自定义适配器自定义适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_从_beach_pzps获取_数据);
//添加列表
最终ListView列表=findViewById(R.id.getDataListView);
list.setItemsCanFocus(true);
//从网站获取数据
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
btnGetData=findviewbyd(R.id.getDataBtn);
btnGetData.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//这是一个很好的例子
试一试{
Connection.Response res=Jsoup.connect(“http://beach.pzps.pl/pl/site/login")
.data(“登录信息[电子邮件]”,“adamandrys7@gmail.com“,“登录信息[密码],“666”)
.method(Connection.method.POST)
.execute();
Map loginCookies=res.cookies();
doc=Jsoup.connect(“http://beach.pzps.pl/pl/tournament/793")
.cookies(loginCookies)
.get();
元素innerTable=doc.select(“.items tbody”).first();
元素行=innerTable.select(“tr”);
用于(元素行:行){
元素单元格=行。选择(“td:eq(4)”;
/*用于(元素单元格:单元格){*/
//MOŻLIWA ZMIANA DO TURNIEJU与ZROBIONE PO ZAKOŃCZENIU TURNIEJU开玩笑
teams=cells.text();
/*}*/
quantityOfTeam++;
//皈依
teams=teams.replaceAll(“\\(.*?\\)”,”);
字符串team1=teams.split(“/”[0];
字符串team2=teams.split(“/”[1];
team1=team1.子字符串(indexOfFirstCapitalLetter(team1));
team2=team2.子字符串(indexOfFirstCapitalLetter(team2));
team1=team1.拆分(“”[0];
team2=team2.split(“”[0];
名称。添加(第1组);
名称。添加(第2组);
}
customAdapter=新的customAdapter(getApplicationContext());
list.setAdapter(customAdapter);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
});
}
类CustomAdapter扩展了BaseAdapter{
私人语境;
私有字符串[]rValues=新字符串[quantityOfTeam];
CustomAdapter(上下文){
this.context=上下文;
}
@凌驾
public int getViewTypeCount(){
返回getCount();
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
@凌驾
public int getCount(){
团队的返回量;
}
@凌驾
公共字符串getItem(int位置){
返回names.get(position)+“\n”+names.get(position+quantityOfTeam);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;

对于(int i=0;i您没有初始化
names
。您需要添加
names=new ArrayList();
作为声明的一部分,或者在代码中使用它之前。如果您希望它只包含检索到的两个团队的名称,那么在
names.add(team1)之前添加该语句;

跳过的帧与您的问题无关。
空对象引用
由于未初始化
名称
而导致的错误

因此,首先:

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

Omfg…太多的编码,我还没有看到…Thx
names.clear(); 
for(Element row:rows) {