我是 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/