我在尝试将add方法用于ArrayList时出现此错误。我可以看到很多人都有同样的问题,但他们在向arraylist添加元素之前没有初始化arraylist。但我正在尝试添加,而且,我仍然要求控制台返回消息arraylist在方法之前是否为null,并且它返回false。
public class ShowTalkActivity extends Activity implements OnClickListener {
private ListView listView;
ArrayList<String> messages;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_talk);
Intent intent = getIntent();
String selected = intent.getStringExtra("selected");
setTitle(selected);
listView = (ListView) findViewById(R.id.messagesList);
messages = new ArrayList<String>();
adapter = new ArrayAdapter<String>(this,R.layout.message_list_row, R.id.messagesList, messages);
listView.setAdapter(adapter);
((Button) findViewById(R.id.sendMessage)).setOnClickListener(this);
}
...
@Override
public void onClick(View view) {
System.out.println(messages==null);
messages.add("Anything");
adapter.notifyDataSetChanged();
}
}
系统出来println(消息==空);打印错误。我还尝试在开始时初始化messages ArrayList,而不仅仅是声明。有人知道发生了什么事吗?谢谢
使现代化
以下是logcat跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:392)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
at android.widget.AbsListView.obtainView(AbsListView.java:2344)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillDown(ListView.java:698)
at android.widget.ListView.fillFromTop(ListView.java:759)
at android.widget.ListView.layoutChildren(ListView.java:1673)
at android.widget.AbsListView.onLayout(AbsListView.java:2148)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2072)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1829)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
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:5221)
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:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
查看logcat可以清楚地看到,当它提到设置某个TextView或其他视图对象时,抛出了一个空对象引用错误,几乎可以肯定的是,视图对象设置不正确。这就是当您遇到这些错误时必须查看的地方。
此外,列表不必包含要设置为适配器的内容。正如您在下面的代码中所看到的,我创建了一个新的“list\u for\u comm”实例
2)然后我将其设置为适配器adapter_comm
3) 然后我继续用空字符串填充列表。
4) 然后,如果希望在UI中实际看到列表更改,请使用“notifyDataSetChanged”通知适配器
5) 如果你的脸上还没有笑容,那就微笑吧。
public void initAllCommListStuff()
{
lv_comm = (ListView_CommBar) findViewById(R.id.listView_with_comm_bar);
lv_comm.setDivider(null);
list_for_comm = new ArrayList<>(5);
adapter_comm = new Adapter_CommBar(DisplayContactActivity.this, R.layout.comm_bar_layout_dc_portrait, list_for_comm);
lv_comm.setAdapter(adapter_comm);
for (int i=0; i<5; i++)
{
list_for_comm.add(new Adapter_GetSet_MovingBar(i, "", ""));
}
adapter_comm.notifyDataSetChanged();
}
编辑:我完全错了。这句话是错误的:你不能用空的ArrayList设置适配器,即使你之前初始化了它。适配器会发现没有值并抛出异常。
所以我的解决方案是无用的。如果没用,我会在2天后删除它。我后来确实注意到哪个是问题,但已经有人回答了。:)EDIT END
您不能用空的ArrayList设置适配器,即使您之前初始化了它。适配器将找不到值并引发异常。
尝试以下操作:
public class ShowTalkActivity extends Activity implements OnClickListener {
private ListView listView;
ArrayList<String> messages;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_talk);
Intent intent = getIntent();
String selected = intent.getStringExtra("selected");
setTitle(selected);
listView = (ListView) findViewById(R.id.messagesList);
messages = new ArrayList<String>();
//adapter = new ArrayAdapter<String>(this,R.layout.message_list_row, R.id.messagesList, messages);
//listView.setAdapter(adapter);
((Button) findViewById(R.id.sendMessage)).setOnClickListener(this);
}
...
@Override
public void onClick(View view) {
//System.out.println(messages==null);
messages.add("Anything");
if (adapter == null) {
adapter = new ArrayAdapter<String>(this,R.layout.message_list_row, R.id.messagesList, messages);
listView.setAdapter(adapter);
}
else {
adapter.addAll(messages);
adapter.notifyDataSetChanged();
}
}
希望我能理解你的要求。
主要活动。JAVA
package com.example.example;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity implements OnClickListener {
private ListView listView;
ArrayList<String> messages;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Setted title");
listView = (ListView) findViewById(R.id.messagesList);
messages = new ArrayList<String>();
adapter = new ArrayAdapter(this, R.layout.message_list_row,
R.id.messagesList, messages);
listView.setAdapter(adapter);
Button sendmessage = (Button) findViewById(R.id.sendMessage);
sendmessage.setOnClickListener(this);
}
@Override
public void onClick(View view) {
System.out.println(messages == null);
messages.add("Anything");
adapter.notifyDataSetChanged();
}
}
我希望了解更多关于数据结构和它们的实现(在JAVA语言中)。今天我写了一个测试来比较ADT列表的不同实现(时间比较)。具体来说,我比较了add方法,下面是我的测试: 我得到了这个结果: ArrayBased:5681 LinkedList:12830 ArrayBasedInitializedSize:858
为什么我可以初始化ArrayList,如下所示: 但在使用时出错:
我有以下Java代码: 但是,当我运行它时,它会抛出以下错误: 我在do之前初始化了变量。while 循环,并在 try. 中设置值。捕获循环。似乎尚未设置该变量。抱歉,如果这是一个相当基本的问题,但我似乎无法弄清楚。
问题内容: 这是无效的代码: 这是一个愚蠢的示例,但是在静态类构造函数中,我们不能这样做。为什么?是否有充分的理由呢?有人对此有更多了解吗? 因此,我应该这样做的原因是在那里结束构建。 谢谢 问题答案: 我认为原因是初始化程序与字段初始化(以及实例初始化程序的构造函数)一起携带。换句话说,JVM仅识别一个位置来初始化静态字段,因此所有的初始化(无论是否以块为单位)都必须在此完成。 因此,例如,当您
致命异常:main java.lang.RuntimeException:无法启动活动组件Info{com.example.increative/com.example.increve.comments}:java.lang.nullpointerException 1at android.app.activitythread.performLaunchActivity(activitythrea
我有一个非常基本的问题。我需要如何为ArrayList键入parrameters才能在BlueJ中使用代码?我有一个方法如下。