마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Json에서 불러온 파싱 데이터를 리스트뷰에 넣는 과정에서 NullPointerException이 발생합니다

0 추천

프래그먼트의 리사이클러뷰에 당일 급식을 표시하는 애플리케이션을 제작하려고 합니다. 일단 Json객체가 제대로 불러와지고 읽어지는 것까지는 확인했는데 그걸 리사이클러뷰에 담으려고 하니 NullPointerException이 발생합니다.

 

GalleryFragment.java

public class GalleryFragment extends Fragment {
    long mNow;
    Date mDate;
    SimpleDateFormat mFormat = new SimpleDateFormat("yyyyMMdd");
    String res = ".";


    private GalleryViewModel galleryViewModel;
    private FragmentGalleryBinding binding;

    RecyclerView recyclerView;
    MealAdapter adapter;


public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        galleryViewModel =
                new ViewModelProvider(this).get(GalleryViewModel.class);

        binding = FragmentGalleryBinding.inflate(inflater, container, false);
        View root = binding.getRoot();

        recyclerView = root.findViewById(R.id.recyclerView);

      

        adapter = new MealAdapter();
        recyclerView.setAdapter(adapter);


      
        dayNow();

        String urlForm = "https://open.neis.go.kr/hub/mealServiceDietInfo?ATPT_OFCDC_SC_CODE=___&SD_SCHUL_CODE=_______&Type=json&KEY=_";


        final String urlStr = urlForm+"&MLSV_YMD="+dayNow();


        new Thread (new Runnable() {
            @Override
            public void run() {
                request(urlStr);
            }
        }).start();


        //불필요한 부분 제거
        res = res.replace("[{\"head\":[{\"list_total_count\":2},{\"RESULT\":{\"CODE\":\"INFO-000\",\"MESSAGE\":\"정상 처리되었습니다.\"}}]},", "");
        res = res.replace("[{\"head\":[{\"list_total_count\":1},{\"RESULT\":{\"CODE\":\"INFO-000\",\"MESSAGE\":\"정상 처리되었습니다.\"}}]},","");
        res = res.replace("}]}]}", "}]}}");

        TextView textView = root.findViewById(R.id.textView);


      
        return root;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

    public void request(String urlStr) {
        StringBuilder output = new StringBuilder();
        try {
            URL url = new URL(urlStr);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            if (conn != null) {
                conn.setRequestProperty("https.protocols", "TLSv1.2");
                conn.setConnectTimeout(10000);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);

                int resCode = conn.getResponseCode();
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = null;
                while (true) {
                    line = reader.readLine();
                    if (line == null) {
                        break;
                    }

                    output.append(line + "\n");
                }
                reader.close();
                conn.disconnect();

            }
        } catch (Exception ex) {
          
            Log.i(TAG, "request: "+ex.toString());

        }

        res = output.toString();

        processResponse(res);
        
      
    }

    public void processResponse(String res) { 
        Gson gson = new Gson();

        MealList mealList = gson.fromJson(res, MealList.class);
        for (int i = 0; i < mealList.mealServiceDietInfo.row.size(); i++) {   //NullPointerException 발생 지점
            Meal meal = mealList.mealServiceDietInfo.row.get(i);
            adapter.additem(meal);
        }


        adapter.notifyDataSetChanged();
    }

    private String dayNow() {  //당일 날짜
        mNow = System.currentTimeMillis();
        mDate = new Date(mNow);
        return mFormat.format(mDate);
    }


    
}

 

Meal.java

package org.techtown.geubsik;

public class Meal {
    public String ATPT_OFCDC_SC_NM;
    public String SCCUL_NM;
    public String MMEAL_SC_NM;
    public String MLSV_YMN;
    public String DDISH_NM;
    public String ORPLC_INFO;
    public String CAL_INFO;
    public String NTR_INFO;
}

MealList.java

package org.techtown.geubsik;

public class MealList {
    public MealListResult mealServiceDietInfo;
}

 

MealListResult.Java

package org.techtown.geubsik;

import java.util.ArrayList;

public class MealListResult {
    public ArrayList<Meal> row = new ArrayList<Meal>();
}

 

로그캣 메시지

2021-11-07 19:28:16.579 27757-27793/org.techtown.geubsik E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: org.techtown.geubsik, PID: 27757
    java.lang.NullPointerException: Attempt to read from field 'java.util.ArrayList org.techtown.geubsik.MealListResult.row' on a null object reference
        at org.techtown.geubsik.ui.gallery.GalleryFragment.processResponse(GalleryFragment.java:169)
        at org.techtown.geubsik.ui.gallery.GalleryFragment.request(GalleryFragment.java:158)
        at org.techtown.geubsik.ui.gallery.GalleryFragment$1.run(GalleryFragment.java:95)
        at java.lang.Thread.run(Thread.java:761)

Ihatenullpointer (170 포인트) 님이 2021년 11월 7일 질문
mealList.mealServiceDietInfo가 널입니다. gson 파싱이 제대로 안된 것 같네요.
응답데이터에 mealServiceDietInfo 필드가 존재하는지 잘 확인해 보세요. 참고로 JSON은 case sensitive, 즉 대소문자를 구분합니다.
잘 안되시면 JSON 응답 데이터도 올려보시면 좋을 것 같습니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...