안드로이드 스튜디오 'on a null object reference' 발생했습니다.

조회수 677회

안드로이드 스튜디오 어플 제작하는데 문제가 생겼습니다. 이게 on a null object reference 문제가 생겼는데 빨간 부분이 생기지 않아서 도대체 어떻게 해결해야되는지를 모르겠습니다. 로그캣 뒤져보니까 VoiceRecord_Text_List.java:43 이부분이 문제인것 같은데 제가 아직 초보자라 혹시 잘못 집은것은 아닌지 여쭙고 싶습니다. 2022-05-08 21:55:05.898 19442-19442/org.techtown.voiceletter E/AndroidRuntime: FATAL EXCEPTION: main

    Process: org.techtown.voiceletter, PID: 19442
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.techtown.voiceletter/org.techtown.voiceletter.VoiceRecord_Text_List}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
        at org.techtown.voiceletter.VoiceRecord_Text_List.onCreate(VoiceRecord_Text_List.java:43)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

그래서 코드를 길게 올리면 안되지만 우선 제가 의심되는 부분도 같이 올려보겠습니다.

        /* initiate adapter */
        mRecyclerAdapter = new MyRecyclerAdapter();

        /* initiate recyclerview */
        mRecyclerView.setAdapter(mRecyclerAdapter);

거기서 맨 밑의 mRecyclerView.setAdapter(mRecyclerAdapter); 이 부분이 43번째 줄에 해당합니다. 그런데 위에 new MyRecyclerAdapter()하는 부분이 문제인 것으로 생각합니다. 그래서 MyRecyclerAdapter()도 올려보겠습니다.

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {

    private ArrayList<record_voice_text> mRecordVoiceText;

    @NonNull
    @Override
    public MyRecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyRecyclerAdapter.ViewHolder holder, int position) {
        holder.onBind(mRecordVoiceText.get(position));
    }

    public void setTextList(ArrayList<record_voice_text> list){
        this.mRecordVoiceText = list;
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return mRecordVoiceText.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        ImageView check;
        TextView order;
        TextView message;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            check = (ImageView) itemView.findViewById(R.id.check);
            order = (TextView) itemView.findViewById(R.id.order);
            message = (TextView) itemView.findViewById(R.id.message);
        }

        void onBind(record_voice_text item){
            check.setImageResource(item.getResourceId());
            order.setText(item.getOrder());
            message.setText(item.getMessage());
        }
    }
}

제가 아직 초보자인데다가 질문도 처음이라 이상하게 한 점 죄송합니다.

  • 해당 라인이 문제면 mRecycldView가 null인듯합니다. 뷰 관련 코드좀 올려주실 수 있을까요? Eveheeero 2022.5.9 08:00
  • 일단 메세지상으로는 버츄얼 메소드를 오버라이딩 하지 않아 생긴 것 같습니다 Eveheeero 2022.5.9 08:01
  • mRecyclerView는 위에서 private RecyclerView mRecyclerView; 이렇게 선언해서 만든 결과입니다. 혹시 어느 뷰 코드를 올리면 될까요? wonggamggik 2022.5.9 14:43
  • 혹시 findViewById로 할당 해주셨나요? Eveheeero 2022.5.9 20:38
  • 네 mRecyclerView는 mRecyclerView = findViewById(R.id.recyclerView);이렇게 이미 할당 해놨어요 wonggamggik 2022.5.9 23:24

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)