在改进调用中访问接口方法时的Nullpointerexception

时间:2017-11-15 04:32:02

标签: java android retrofit

Nullpointerexception访问retrofit调用

中的接口方法

Userservice.class

public interface UserService {

    @POST("login")
    Call<ResUser> login(@Body login login);
}

RetrofitClient.class

public class RetrofitClient {

    private static Retrofit retrofit=null;

    public static Retrofit getClient(String url){

        if(retrofit==null){
            retrofit=new Retrofit.Builder()
                    .baseUrl(url)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }

        return retrofit;
    }
}

login.class

    private void doLogin(String username,String password){
    Call<ResUser> call=userService.login(new login(username,password));
    call.enqueue(new Callback<ResUser>() {
        @Override
        public void onResponse(Call<ResUser> call, Response<ResUser> response) {
            if(response.isSuccessful()){
             Log.e("succes");
            }
        }

        @Override
        public void onFailure(Call<ResUser> call, Throwable t) {

        }
    });

}

ApiUtils.class

public class ApiUtils {

    public static final String BASE_URL="";

    public static UserService getUserService(){
        return RetrofitClient.getClient(BASE_URL).create(UserService.class);
    }
}

我在此行 nullpointerexception

  Call<ResUser> call=userService.login(new login(username,password));

3 个答案:

答案 0 :(得分:0)

我认为你的问题在login方法中,你应该在致电之前检查null用户名和密码:

  

Call call = userService.login(new login(username,password));

如果对你有帮助,请接受我的回答。

答案 1 :(得分:0)

在您拨打登录服务UserService userService = ApiUtils.getUserService();

之前添加此Call<ResUser> call=userService.login(new login(username,password));代码行
UserService userService = ApiUtils.getUserService(); 
Call<ResUser> call=userService.login(new login(username,password));

你应该有一个名为userService的UserService接口实例来调用方法login()

答案 2 :(得分:0)

好友问题是你在这里传递用户名和密码,所以不要使用构造函数尝试使用getter setter。

在调用之前还要创建userService类的对象,因为它没有在代码中实例化。

UserService userservice = ApiUtils.getUserService(); 

然后尝试以下方式:

Call<ResUser> call=userService.login(new login(username,password));

您需要按照此处的定义传递类Login的Object,它将获得login的对象:

@POST("login")
Call<ResUser> login(@Body login login);

现在的解决方案是,如果您的服务器需要登录类的对象,那么:

在此之前:

Call<ResUser> call=userService.login(new login(username,password));

创建登录类的对象并为该对象设置用户名和密码,然后将此对象传递为:

Login login = new Login();
login.setuserName(username);
login.setpassword(password);
UserService userservice = ApiUtils.getUserService(); 
Call<ResUser> call=userService.login(login);

现在,如果你的服务器在没有登录对象的情况下需要单独使用用户名和密码,那么你需要更改它:

@POST("login")
Call<ResUser> login(@Body login login);

为:

@POST("login")
Call<ResUser> login(@Path("userName") String userName,@Path("password") String password);

但是,你的网络服务路径 @POST(&#34;登录&#34;)表明你不需要用户名和密码,所以第一个解决方案是你的解决方案。制作一个对象如上所述,登录并通过调用传递它。