java - 面临改造 api 的问题。错误 : java. lang.NullPointerException:尝试在空对象引用上调用接口(interface)方法

标签 java android nullpointerexception retrofit

我是 Retrofit API 的新手,我正在努力解决它。我关注了the tutorial on Vogella并能够从 StackExchange 获取数据并将其显示在 ListView 中。但是当我尝试从 TMDB 获取数据时,出现以下错误.

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

以下代码用于在 ListView 中显示 StackExchange url 中的“标题”(工作正常)。

主要 Activity

public class MainActivity extends ListActivity implements Callback<StackOverflowQuestion> {

    ArrayAdapter<Question> madapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        madapter=new ArrayAdapter<Question>(this,android.R.layout.simple_list_item_1,android.R.id.text1,new ArrayList<Question>());
        setListAdapter(madapter);
        Retrofit retrofit= new Retrofit.Builder()
            .baseUrl("http://api.stackexchange.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
        StackOvreflowAPI stackOverflowAPI = retrofit.create(StackOvreflowAPI.class);

        Call<StackOverflowQuestion> call = stackOverflowAPI.load();
        call.enqueue(this);
    }

    @Override
    public void onResponse(Response<StackOverflowQuestion> response, Retrofit retrofit) {

        ArrayAdapter<Question> adapter = (ArrayAdapter<Question>) getListAdapter();
        adapter.clear();
        adapter.addAll(response.body().items);
    }

    @Override
    public void onFailure(Throwable t) {

    }
}

模型类:问题

public class Question {
    public String name;

    @Override
    public String toString() {
        return (name);
    }
}

StackOverflow问题

public class StackOverflowQuestion {
    List<Question> items;
}

StackOverflowAPI

public interface StackOvreflowAPI {
    @GET("/2.2/questions?order=desc&sort=activity&tagged=android&site=stackoverflow")
    Call<StackOverflowQuestion> load();
}
<小时/>

但是当我使用相同的代码从 TMDB url 获取概述时,我收到错误:

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

我只更改了 URL、接口(interface)和模型类。

MainActivity 中所做的更改:

Retrofit retrofit= new Retrofit.Builder()
            .baseUrl("https://api.themoviedb.org")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

使用 .baseUrl("https://api.themoviedb.org") 而不是 .baseUrl("https://api.stackexchange.com") .

界面中所做的更改:

public interface StackOvreflowAPI {
    @GET("/3/movie/popular?api_key=ab5aee0b18da89dd9e026d35754c24f1")
    Call<StackOverflowQuestion> load();
}

使用 @GET("/3/movie/popular?api_key=ab5aee0b18da89dd9e026d35754c24f1") 而不是 @GET("/2.2/questions?order=desc&sort=activity&tagged=android&site=stackoverflow ”)

问题类中所做的更改:

public class Question {
    public String overview;

    @Override
    public String toString() {
        return (overview);
    }
}

标题更改为概述

但是在运行此应用程序时,应用程序崩溃并出现错误:

FATAL EXCEPTION: main
    Process: com.example.maver_000.practise_retrofit, PID: 4270
    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 android.widget.ArrayAdapter.addAll(ArrayAdapter.java:195)
    at com.example.maver_000.practise_retrofit.MainActivity.onResponse(MainActivity.java:40)
    at retrofit.ExecutorCallAdapterFactory$ExecutorCallback$1.run(ExecutorCallAdapterFactory.java:86)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5294)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

最佳答案

检查TMDB API返回的响应结构,我认为“概述”可能不是直接根对象,因此响应的Gson转换可能会失败。

查看 API 响应,将 StackOverFlowQuestion 类的变量名称更改为 results 或添加 @SerializedName 以匹配 json 名称,然后它应该可以工作

关于java - 面临改造 api 的问题。错误 : java. lang.NullPointerException:尝试在空对象引用上调用接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36439962/

相关文章:

android - 如何从 OrientationEventListener 获取 boolean 类型的返回值?

java - BigClip 的问题

java - 引用初始化为 null 的对象数组中的槽

java - 从字符串中删除包含特定单词或部分单词的单词

java - 将 Objectify 与 GAE 一起使用时 ObjectifyService 的 NoClassDefFoundError

android - Xamarin Forms - 如何向 MasterDetailPage 的顶部栏添加额外的控件?

java - Android Studio 中的响应式 View

java - Android 中的 PNG 图像和 InputStream

java - JCodeModel - 如何链接调用方法

java - SureFire 插件 : -"The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? " 的问题