面临改型api的问题。错误:java.lang.NullPointerException:尝试对空对象引用调用接口方法
我是新的改装API,我正在努力与它。我跟随,并能够从中获取数据,并将其显示在列表视图中。但是当我试图从中获取数据时,我得到了下面的错误 下面是在列表视图中显示StackExchange url中的“标题”的代码(这工作正常) main活动面临改型api的问题。错误:java.lang.NullPointerException:尝试对空对象引用调用接口方法,java,android,nullpointerexception,retrofit,Java,Android,Nullpointerexception,Retrofit,我是新的改装API,我正在努力与它。我跟随,并能够从中获取数据,并将其显示在列表视图中。但是当我试图从中获取数据时,我得到了下面的错误 下面是在列表视图中显示StackExchange url中的“标题”的代码(这工作正常) main活动 public class MainActivity extends ListActivity implements Callback<StackOverflowQuestion> { ArrayAdapter<Question>
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) {
}
}
StackOverflowQuestion
public class Question {
public String name;
@Override
public String toString() {
return (name);
}
}
public class StackOverflowQuestion {
List<Question> items;
}
我只更改了URL、接口和模型类
在主活动中所做的更改:
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://api.themoviedb.org")
.addConverterFactory(GsonConverterFactory.create())
.build();
public interface StackOvreflowAPI {
@GET("/3/movie/popular?api_key=ab5aee0b18da89dd9e026d35754c24f1")
Call<StackOverflowQuestion> load();
}
public class Question {
public String overview;
@Override
public String toString() {
return (overview);
}
}
使用.baseUrl(“https://api.themoviedb.org“”
而不是.baseUrl(“”https://api.stackexchange.com)
在界面中所做的更改:
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://api.themoviedb.org")
.addConverterFactory(GsonConverterFactory.create())
.build();
public interface StackOvreflowAPI {
@GET("/3/movie/popular?api_key=ab5aee0b18da89dd9e026d35754c24f1")
Call<StackOverflowQuestion> load();
}
public class Question {
public String overview;
@Override
public String toString() {
return (overview);
}
}
将标题
更改为概述
但运行此应用程序时,应用程序会崩溃,并出现以下错误:
java.lang.NullPointerException: Attempt to invoke interface method
'java.lang.Object[] java.util.Collection.toArray()' on a null object reference.
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返回的响应结构,我认为“overview”可能不是直接的根对象,因此响应的Gson转换可能会失败
查看API响应,将StackOverFlowQuestion类的变量名更改为results或添加@SerializedName以匹配json名称,然后它应该可以工作检查TMDB API返回的响应结构,我认为“overview”可能不是直接的根对象,因此响应的Gson转换可能会失败
查看API响应,将StackOverFlowQuestion类的变量名更改为results或添加@SerializedName以匹配json名称,那么它应该可以工作您能验证API调用是否成功吗?您可以通过选中call.Issuccessful执行onresponse方法来执行此操作。您可以打印stacktrace吗?@AbhinavNair response.isSuccess()返回true,response=null为true,response.errorBody()=null为false。我应该更改什么才能成功获取数据?您能否验证api调用是否成功?您可以通过选中call.Issuccessful执行onresponse方法来执行此操作。您可以打印stacktrace吗?@AbhinavNair response.isSuccess()返回true,response=null为true,response.errorBody()=null为false。我应该更改什么才能成功获取数据?向变量项添加@SerializedName(“结果”)。现在开始工作了。非常感谢。脱帽致敬,真的帮了我的忙。感谢将@SerializedName(“结果”)添加到变量项。现在开始工作了。非常感谢。脱帽致敬,真的帮了我的忙。谢谢