尝试使用 JSON 填充 Spinner 并在空对象引用上获取 'java.lang.Object[] java.util.Collection.toArray()'

Trying to Populate Spinner with JSON and getting 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference

我是一名 android 新手,正在尝试使用 JSON 填充微调器,但我一直收到空指针异常 -

  java.lang.NullPointerException: Attempt to invoke interface method
  java.lang.Object[] java.util.Collection.toArray()' on a null object
 reference

我知道这是一个常见问题,并已查看其他答案和解决方案。我已尝试初始化列表,但仍然无法修复 error.I 认为我无法理解确切需要初始化的位置。

我的完整日志:

07-19 09:34:54.356 11199-11337/com.genx.meghna.makdver4 D/Result is: [{"car_number":"DL 2345"},{"car_number":"DL 53546"},{"car_number":"1472"},{"car_number":"m7894"},{"car_number":"nxjvjsv"}]
07-19 09:34:54.356 11199-11337/com.genx.meghna.makdver4 D/res =: [{"car_number":"DL 2345"},{"car_number":"DL 53546"},{"car_number":"1472"},{"car_number":"m7894"},{"car_number":"nxjvjsv"}]
07-19 09:34:54.357 11199-11337/com.genx.meghna.makdver4 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
   Process: com.genx.meghna.makdver4, PID: 11199
   java.lang.RuntimeException: An error occured while executing doInBackground()
       at android.os.AsyncTask.done(AsyncTask.java:300)
       at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
       at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
       at java.util.concurrent.FutureTask.run(FutureTask.java:242)
       at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:818)
    Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
       at java.util.ArrayList.addAll(ArrayList.java:188)
       at com.genx.meghna.makdver4.Fragments.SendCarFragment$GetData.doInBackground(SendCarFragment.java:173)
       at com.genx.meghna.makdver4.Fragments.SendCarFragment$GetData.doInBackground(SendCarFragment.java:117)
       at android.os.AsyncTask.call(AsyncTask.java:288)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231) 
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
       at java.lang.Thread.run(Thread.java:818) 

我的代码:

package com.genx.meghna.makdver4.Fragments;


import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.genx.meghna.makdver4.R;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import static com.genx.meghna.makdver4.Fragments.LoginFragment.un;


public class SendCarFragment extends Fragment {

    TextView tv1, tv2, tv3;
    Spinner sp;
    RadioGroup rg;
    RadioButton rb1, rb2;
    Button btn;
    FragmentManager fm;
    ArrayList<String> carList;
    ArrayAdapter<String> adapter;
    String res;
    SharedPreferences spp;


    public SendCarFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_send_car, container, false);
        btn = rootView.findViewById(R.id.nextPage1);
        rg = rootView.findViewById(R.id.radioGroup1);
        rb1 = rootView.findViewById(R.id.rb1);
        rb2 = rootView.findViewById(R.id.rb2);

        sp = rootView.findViewById(R.id.spinnerSelectCar);

        spp=getContext().getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);

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

                if (rg.getCheckedRadioButtonId() == -1) {
                    Toast.makeText(getContext(), "Select One Option", Toast.LENGTH_SHORT).show();
                } else {
                    if (rb1.isChecked()) {
                        fm = getFragmentManager();
                        fm.beginTransaction().replace(R.id.container, new ServiceCenterListFragment(), "Service center").commit();

                    } else {

                        fm = getFragmentManager();
                        fm.beginTransaction().replace(R.id.container, new SelectionFragment(), "Select Address").commit();
                    }
                }
            }
        });

        return rootView;
    }

   public void onStart(){
        super.onStart();
        String username1 = spp.getString(un, "userKey");
        GetData get = new GetData();
        get.execute(username1);
    }

    class GetData extends AsyncTask<String, Void, String> {
      List<String> list;
       protected void onPreExecute(){
            super.onPreExecute();
            list=new ArrayList<>();
        }

        @Override
        protected String doInBackground(String... params) {
            {
                try {
                    String username1 = params[0];

                    String link = "http://10.0.3.2//Traccar/getCars.php";
                    String myurl = "username=" + username1;
                    URL url = new URL(link);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("POST");
                    connection.getOutputStream().write(myurl.getBytes());
                    int response = connection.getResponseCode();
                    Log.d("Response code", "" + response);

                    if (response == HttpURLConnection.HTTP_OK) {
                        String line;
                        InputStreamReader isr = new InputStreamReader(connection.getInputStream());
                        BufferedReader br = new BufferedReader(isr);
                        StringBuilder buffer = new StringBuilder();
                        while ((line = br.readLine()) != null) {
                            buffer.append(line);
                            //res+=line;
                        }

                        Log.d("Result is", buffer.toString());
                        res = buffer.toString();
                        Log.d("res = ", res);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            try{
                JSONArray jrr =  new JSONArray(res);
                for (int i=0; i<jrr.length(); i++) {
                    JSONObject obj = jrr.getJSONObject(i);
                    String name = obj.getString("car_number");
                    list.add(name);
                }
            } catch (JSONException e1) {
                e1.printStackTrace();
            }

            return res;
        }


        protected void onPostExecute(String res) {

            list.addAll(carList);
            adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, carList);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            sp.setAdapter(adapter);


        }
    }
}

我尝试的另一种方法是将我的 JSON 解析代码放在 onPostExecute() 函数中,但我一直无法尝试将我的数组从 doInBackground() 传递到 onPostExecute()这导致我的 onPostExecute() 从未被使用过。

如有任何帮助,我们将不胜感激。谢谢!

你有一个 carList 和一个 list。您不初始化或添加项目到 carList,而是尝试将其传递给 list.addAll(carList);,这自然无法工作。

由于数据已经在 list 中,您应该可以这样做

class GetData extends AsyncTask<String, Void, List<String>> {
   List<String> list;

   protected void onPreExecute(){
        super.onPreExecute();
        list=new ArrayList<>();
    }

    @Override
    protected String doInBackground(String... params) {
        {
            try {
                String username1 = params[0];

                String link = "http://10.0.3.2//Traccar/getCars.php";
                String myurl = "username=" + username1;
                URL url = new URL(link);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.getOutputStream().write(myurl.getBytes());
                int response = connection.getResponseCode();
                Log.d("Response code", "" + response);

                if (response == HttpURLConnection.HTTP_OK) {
                    String line;
                    InputStreamReader isr = new InputStreamReader(connection.getInputStream());
                    BufferedReader br = new BufferedReader(isr);
                    StringBuilder buffer = new StringBuilder();
                    while ((line = br.readLine()) != null) {
                        buffer.append(line);
                        //res+=line;
                    }

                    Log.d("Result is", buffer.toString());
                    res = buffer.toString();
                    Log.d("res = ", res);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try{
            JSONArray jrr =  new JSONArray(res);
            for (int i=0; i<jrr.length(); i++) {
                JSONObject obj = jrr.getJSONObject(i);
                String name = obj.getString("car_number");
                list.add(name);
            }
        } catch (JSONException e1) {
            e1.printStackTrace();
        }

        return list;
    }


    protected void onPostExecute(List<String> res) {

        adapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1, res);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp.setAdapter(adapter);


    }
}

请注意,我将 AsyncTask 更改为 AsyncTask<String, Void, List<String>>,不需要 carList