空指针异常,改型吗?

时间:2018-07-25 13:16:01

标签: android nullpointerexception retrofit2

我正在尝试从URL获取ID,但得到空指针异常

  

java.lang.NullPointerException:尝试从空对象引用中的字段'java.lang.String com.hex.encode.ID_Model $ User.id'中读取           在com.hex.encode.Home $ 3.onResponse(Home.java:99)

这是我用来获取ID的代码:

private void GetID() {
        Call<ID_Model> idcall = fetchdata.getIdService().getID(user_search);
        idcall.enqueue(new Callback<ID_Model>() {
            @Override
            public void onResponse(@NonNull Call<ID_Model> call,@NonNull Response<ID_Model> response) {
                assert response.body() != null;
                String fetched_id =response.body().getUser().getId;//this is where the exception is poping
                GetData(fetched_id);
            }

            @Override
            public void onFailure(@NonNull Call<ID_Model> call, @NonNull Throwable t) {
                //something//
            }
        });
    } 

和下面是fetchdata类:

class fetchdata {
    private static UserFetchData userdatafetch = null;
    private static UserIDFetch fetchService = null;

    static  UserIDFetch getIdService() {
        if (fetchService == null) {
            String id_url = "url_and_it's_working";
            Retrofit fetch_id = new Retrofit.Builder()
                    .baseUrl(id_url)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            fetchService = fetch_id.create(UserIDFetch.class);
        }
        return fetchService;
    }

    public interface UserIDFetch{
        @GET("{user_input}"+"/")
        Call<ID_Model> getID(@Path("user_input") String s);
    }
}

修改

这是Id_Model:

public class ID_Model {

    @SerializedName("user")
    @Expose
    public User user;

    public User getUser() {
        return user;
    }

    public class User {

        @SerializedName("id")
        @Expose
        public String id;

        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }

    }
}

修改 这是来自API服务器的响应: https://justpaste.it/4gk8r

2 个答案:

答案 0 :(得分:2)

您需要检查response.isSucessful()的响应是否成功。而且还取决于服务器端,当 API 成功命中服务器时,它们会发送200,然后我们需要检查 API 响应是否为{{1} }或success

对于您而言,我认为 API 调用成功,failure并返回了一些响应,但是200response.body().getUser()。因此,您必须检查 API 的响应。

答案 1 :(得分:2)

您的回复看起来像这样

{
   ... 
  "graphql": {
     "user": {
       ... 
      "id": "1067259270",

这意味着您忘记了解析graphql密钥以及所有其他密钥,因此用户为null。

您绝对需要一个这样的模型。

class ResponseModel {
    GraphQLModel graphql;

    class GraphQLModel {
        UserModel user;

        class UserModel {
            int id;
        } 
    } 
} 

The Groovy Templates Cheat Sheet for JMeter并使用apollo-codegen(如果使用Apollo Client)生成模型