zooom
10
2020-11-22 06:34:54
6
124

Android Studio ListView null object 에러 도와주세요


안녕하세요, 안드로이드 스튜디오 공부를 시작한지 며칠안됐는데 처음 발생하는 에러인데 아무리 검색해봐도 제 상황에 맞는 해결방법이 나오질 않아 질문 드립니다

우선 listview와 add기능이 있는 버튼을 이용하여 어떤 값을 적고 add 버튼을 누르면 리스트에 추가되는 앱입니다.

run 해보면 build까진 잘되고 에뮬레이터에서 실행도 되는듯하다가 바로 강제종료되버리더라구요. logcat보니까  setAdapter(adapter) 부분에서 오류가 계속 발생하네요..아래는 제 코드 전체와 오류부분 logcat입니다.


MainActivity.java

package com.example.dynamic_list_view;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    EditText editText1;
    Button buttonAdd;
    ListView listView1;
    ArrayAdapter<String> adapter;
    ArrayList<String> array;

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

        setContentView(R.layout.dynamic_list_view);

        array = new ArrayList<String>();
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array);
        listView1.setAdapter(adapter);

        editText1 = (EditText) findViewById(R.id.editText1);
        buttonAdd = (Button) findViewById(R.id.buttonAdd);
        ListView listView1 = (ListView) findViewById(R.id.listView1);

        buttonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                array.add(editText1.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });
        listView1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                array.remove(i);
                adapter.notifyDataSetChanged();
                return false;

            }
        });
    }
}


dynamic_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <!--
        List the elements in one direction.
        Set layout's width and height as long as the parent has.
    -->

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/buttonAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>


logcat


     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
        at com.example.dynamic_list_view.MainActivity.onCreate(MainActivity.java:31)


null object reference인 경우를 구글링해서 해결방법을 찾아보니

1.setContentView(R.layout.dynamic_list_view) 추가하기

2.ListView listView1 = (ListView) findViewById(R.id.listView1) 라고 쓰기

3.listView의 id가 xml있는지 확인하기/xml에 있는 id와 정확히 일치하는지 검토해보기

이정도인거같던데 1,2번은 해봐도 똑같은 오류가 반복되고, 처음부터 3은 id를 틀리게 적진 않았습니다


도대체 어떤 것이 문제일까요? 이거 하나로 6시간동안 고민했는데 도저히 해답이 보이질 않아 질문 올립니다 도와주세요 ㅠㅠ

0
  • 답변 6

  • 샤르르
    341
    2020-11-22 09:08:30
    listview1.setadapter를 findviewbyid 아래에 두세요
  • zooom
    10
    2020-11-22 12:07:19 작성 2020-11-22 12:07:59 수정됨

    그래도 똑같은 에러가 발생하네요 ...

  • 샤르르
    341
    2020-11-22 12:56:13

    그럴리가 없는데요 


    ListView listView1 = (ListView) findViewById(R.id.listView1);

    여기 아래에 두었는데도 널포인터가 떨어지나요?


  • zooom
    10
    2020-11-22 13:24:51 작성 2020-11-24 12:46:15 수정됨

    아 실행되네요! 제가 잘못하고 listView1.setOnItemLong... 의 위치를 바꿨네요 감사합니다 ^^ 

    근데 listview1.setadapter를 findviewbyid 아래에 두는 것과 그렇지 않은 것에서 차이가 무엇이기에 에러가 발생하는 것인가요? 자바 문법에서 발생한 에러인가요?

  • 샤르르
    341
    2020-11-22 14:20:47

    자바랑 안드랑 섞여있는데

    객체는 생성을 해야 함수를 호출할 수 있어요

    여기선 생성된 객체를 이어주는 작업을 먼저 한 것이구요

  • zooom
    10
    2020-11-22 14:41:01

    그렇군요 감사합니다 ^^ 기분 좋은 하루 되세요 ~

  • 로그인을 하시면 답변 을 등록할 수 있습니다.