当前位置: 首页 > 知识库问答 >
问题:

ArrayList已初始化,但尝试时仍返回NullPointerException。add(string)方法

公良鸿光
2023-03-14

我在尝试将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)

共有3个答案

淳于熙云
2023-03-14

查看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();
}
燕永昌
2023-03-14

编辑:我完全错了。这句话是错误的:你不能用空的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();
    }
}

希望我能理解你的要求。

松高爽
2023-03-14

主要活动。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中使用代码?我有一个方法如下。