Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试调用接口方法<;MyInterfaceMethod>;关于空对象引用_Java_Android_Json - Fatal编程技术网

Java 尝试调用接口方法<;MyInterfaceMethod>;关于空对象引用

Java 尝试调用接口方法<;MyInterfaceMethod>;关于空对象引用,java,android,json,Java,Android,Json,我是Android新手,正在开发一个应用程序,尝试连接服务器并获取Json响应,将其解析为类并使其可用 为此,我上了三门课 公共类客户{} 公共类ServerConnect{} 公共类JsonParser{} Serverconnect使用Volley库在异步线程上下载网页源代码。下载后,Server Connect类启动OnServerResponsed(String Response)listner。此响应是JsonParser类的输入。JsonParser类成功获取客户列表后,将触发另一个

我是Android新手,正在开发一个应用程序,尝试连接服务器并获取Json响应,将其解析为类并使其可用

为此,我上了三门课

  • 公共类客户{}
  • 公共类ServerConnect{}
  • 公共类JsonParser{}
  • Serverconnect使用Volley库在异步线程上下载网页源代码。下载后,Server Connect类启动OnServerResponsed(String Response)listner。此响应是JsonParser类的输入。JsonParser类成功获取客户列表后,将触发另一个名为onCustomersParsed(list customers)的listner。稍后的处理在onCustomersParsed回调中完成

    但是我得到了一个致命的例外

    尝试调用接口方法“void” app.utilities.JsonParser$OnCustomersParserListner.onCustomersParsed() 关于空对象引用

    我已经尽力了,但失败了。这是我的密码

    package app.elements;
    
    /**
     * Created by Sangeeth Nandakumar on 13-02-2017.
     */
    
    public class Customer
    {
        private String id;
        private String firstname;
        private String lastname;
        private String device;
        private String gender;
    
        public Customer(String id, String firstname, String lastname, String device,String gender)
        {
            this.id = id;
            this.firstname = firstname;
            this.lastname = lastname;
            this.device = device;
            this.gender = gender;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getFirstname() {
            return firstname;
        }
    
        public void setFirstname(String firstname) {
            this.firstname = firstname;
        }
    
        public String getLastname() {
            return lastname;
        }
    
        public void setLastname(String lastname) {
            this.lastname = lastname;
        }
    
        public String getDevice() {
            return device;
        }
    
        public void setDevice(String device) {
            this.device = device;
        }
    }
    
    这是我的服务器连接器类

    package app.utilities;
    
    import android.content.Context;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.StringRequest;
    import com.android.volley.toolbox.Volley;
    
    /**
     * Created by Sangeeth Nandakumar on 18-02-2017.
     * Highly optimised Google's Volley driven async webpage source downloader
     */
    
    public class ServerConnector
    {
        //Member variables
        private Context context;
    
        //Override interfaces
        public interface OnServerStatusListner
        {
            public void onServerResponded(String responce);
            public void onServerRevoked();
        }
    
        //New listner
        private OnServerStatusListner listner;
    
        //Listner function
        public void setOnServerStatusListner(OnServerStatusListner myststus)
        {
            listner=myststus;
        }
    
        //Constructor
        public ServerConnector(Context context)
        {
            this.context = context;
        }
    
        //Connect to server
        public void connectServer(String url)
        {
            //Create a request queue
            RequestQueue queue= Volley.newRequestQueue(context);
            //Tunnel the request
            StringRequest stringRequest=new StringRequest(Request.Method.GET, url,
                    //When request success
                    new Response.Listener<String>()
                    {
                        @Override
                        public void onResponse(String response)
                        {
                            listner.onServerResponded(response);
                        }
                    },
                    //When request fails
                    new Response.ErrorListener()
                    {
                        @Override
                        public void onErrorResponse(VolleyError error)
                        {
                            listner.onServerRevoked();
                        }
                    });
            //Add the request to queue
            queue.add(stringRequest);
        }
    
    }
    
    package app.utilities;
    导入android.content.Context;
    导入com.android.volley.Request;
    导入com.android.volley.RequestQueue;
    导入com.android.volley.Response;
    导入com.android.volley.VolleyError;
    导入com.android.volley.toolbox.StringRequest;
    导入com.android.volley.toolbox.volley;
    /**
    *由Sangeeth Nandakumar于2017年2月18日创建。
    *高度优化的谷歌截击驱动异步网页源下载程序
    */
    公共类服务器连接器
    {
    //成员变量
    私人语境;
    //覆盖接口
    ServerStatusListner上的公共接口
    {
    服务器响应的公共void(字符串响应一次);
    服务器上的公共无效已撤销();
    }
    //新listner
    私有OnServerStatusListner-listner;
    //Listner函数
    public void setOnServerStatusListner(OnServerStatusListner myststus)
    {
    listner=myststus;
    }
    //建造师
    公共服务器连接器(上下文)
    {
    this.context=上下文;
    }
    //连接到服务器
    公共服务器(字符串url)
    {
    //创建请求队列
    RequestQueue=Volley.newRequestQueue(上下文);
    //通过隧道传送请求
    StringRequest StringRequest=新的StringRequest(Request.Method.GET,url,
    //当请求成功时
    新的Response.Listener()
    {
    @凌驾
    公共void onResponse(字符串响应)
    {
    onServerResponsed(响应);
    }
    },
    //当请求失败时
    新的Response.ErrorListener()
    {
    @凌驾
    公共无效onErrorResponse(截击错误)
    {
    onServerReversed();
    }
    });
    //将请求添加到队列中
    添加(stringRequest);
    }
    }
    
    这是我的JSON-PARSER类

    package app.utilities;
    
    import android.content.Context;
    import android.widget.Toast;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.util.ArrayList;
    import java.util.List;
    import app.elements.Customer;
    
    /**
     * Created by Sangeeth Nandakumar on 18-02-2017.
     * Highly optimised Json parserclass with multiple listners
     */
    
    public class JsonParser
    {
        //Data members
        private Context context;
        private String jsontext;
        private List<Customer> customers=new ArrayList<>();
    
        //Listner object
        public OnCustomersParserListner listner;
    
        //Listners
        public interface OnCustomersParserListner
        {
            public void onCustomersParsed(List<Customer> customers);
        }
    
        //On Jsonparse listner
        public void setOnJsonParseListner(OnCustomersParserListner mylistner)
        {
            listner=mylistner;
        }
    
        //Constructor
        public JsonParser(Context context, String jsontext)
        {
            this.context = context;
            this.jsontext = jsontext;
        }
    
        //Json pre-parsing
        public void parseCustomers()
        {
            // If json is true
            if (jsontext != null)
            {
                try
                {
                    //Create a JSON object
                    JSONObject jsonObj = new JSONObject(jsontext);
                    // Getting JSON Array node
                    JSONArray json = jsonObj.getJSONArray("details");
                    // Looping through All Contacts
                    for (int i = 0; i < json.length(); i++)
                    {
                        JSONObject details = json.getJSONObject(i);
                        //Get all customer details from JSON file
                        String id = details.getString("id");
                        String firstname = details.getString("firstname");
                        String lastname = details.getString("lastname");
                        String device = details.getString("device");
                        String gender = details.getString("gender");
                        //Add to list
                        customers.add(new Customer(id,firstname,lastname,device,gender));
                    }
                    listner.onCustomersParsed(customers);
                }
                catch (final JSONException e)
                {
                    Toast.makeText(context, "Error in parsing JSON", Toast.LENGTH_SHORT).show();
                }
            }
            else
            {
                Toast.makeText(context, "JSON text is empty", Toast.LENGTH_SHORT).show();
            }
        }
    
    }
    
    package app.utilities;
    导入android.content.Context;
    导入android.widget.Toast;
    导入org.json.JSONArray;
    导入org.json.JSONException;
    导入org.json.JSONObject;
    导入java.util.ArrayList;
    导入java.util.List;
    导入app.elements.Customer;
    /**
    *由Sangeeth Nandakumar于2017年2月18日创建。
    *具有多个列表器的高度优化的Json parserclass
    */
    公共类JsonParser
    {
    //数据成员
    私人语境;
    私有字符串jsontext;
    private List customers=new ArrayList();
    //Listner对象
    公共OnCustomersParserListner-listner;
    //列表器
    客户SparSerListner上的公共接口
    {
    客户(列出客户)时的公共作废;
    }
    //关于Jsonparse-listner
    public void setOnJsonParseListner(oncustomersparselistner mylistner)
    {
    listner=mylistner;
    }
    //建造师
    公共JsonParser(上下文,字符串jsontext)
    {
    this.context=上下文;
    this.jsontext=jsontext;
    }
    //Json预解析
    公共服务客户()
    {
    //如果json为true
    if(jsontext!=null)
    {
    尝试
    {
    //创建一个JSON对象
    JSONObject jsonObj=新的JSONObject(jsontext);
    //获取JSON数组节点
    JSONArray json=jsonObj.getJSONArray(“详细信息”);
    //通过所有触点循环
    for(int i=0;i
    这是来自主活动的呼叫

    ServerConnector server=new ServerConnector(this);
    server.connectServer("http://amazinginside.esy.es/customerlist.php");
    
    server.setOnServerStatusListner(new ServerConnector.OnServerStatusListner()
    {
        @Override
        public void onServerResponded(String responce)
        {
            Toast.makeText(MainActivity.this, "Server responded",      Toast.LENGTH_SHORT).show();
            JsonParser parser=new JsonParser(getApplicationContext(),responce);
            parser.parseCustomers();
            parser.setOnJsonParseListner(new JsonParser.OnCustomersParserListner() {
                @Override
                public void onCustomersParsed(List<Customer> customers) {
                    Toast.makeText(MainActivity.this, customers.get(0).getFirstname(), Toast.LENGTH_SHORT).show();
                }
            });
    
        }
        @Override
        public void onServerRevoked()
        {
            Toast.makeText(MainActivity.this, "Connection to server broke", Toast.LENGTH_SHORT).show();
        }
    });
    
    ServerConnector服务器=新的ServerConnector(此);
    server.connectServer(“http://amazinginside.esy.es/customerlist.php");
    server.setOnServerStatusListner(新的ServerConnector.OnServerStatusListner()
    {
    @凌驾
    服务器上的公共无效已响应(字符串响应一次)
    {
    Toast.makeText(MainActivity.this,“服务器响应”,Toast.LENGTH_SHORT.show();
    
    @Override
    public void onServerResponded(String responce)
    {
        Toast.makeText(MainActivity.this, "Server responded",      Toast.LENGTH_SHORT).show();
        JsonParser parser=new JsonParser(getApplicationContext(),responce);
        parser.setOnJsonParseListner(new JsonParser.OnCustomersParserListner() {
            @Override
            public void onCustomersParsed(List<Customer> customers) {
                Toast.makeText(MainActivity.this, customers.get(0).getFirstname(), Toast.LENGTH_SHORT).show();
            }
        });
        parser.parseCustomers();
    
    }