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

안드로이드 mysql php로 데이터 불러오기 - nullpointexception..

0 추천
http://webnautes.tistory.com/829

이 예제를 보고 간단한 어플을 구현중입니다.

그런데 php와 mysql은 확실히 연동이 되는데, 안드로이드와 php가 연동을 하지못합니다.

 

                  --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.park.smart_shopper2, PID: 2881
                  java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                      at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
                      at org.json.JSONTokener.nextValue(JSONTokener.java:94)
                      at org.json.JSONObject.<init>(JSONObject.java:156)
                      at org.json.JSONObject.<init>(JSONObject.java:173)
                      at com.example.park.smart_shopper2.MainActivity.showList(MainActivity.java:51)
                      at com.example.park.smart_shopper2.MainActivity$1GetDataJSON.onPostExecute(MainActivity.java:122)
                      at com.example.park.smart_shopper2.MainActivity$1GetDataJSON.onPostExecute(MainActivity.java:89)
                      at android.os.AsyncTask.finish(AsyncTask.java:667)
                      at android.os.AsyncTask.-wrap1(AsyncTask.java)
                      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Application terminated.

 

 

이런 nullpointerexception 오류가 나오는데요, 데이터베이스에 null값이 있는건 절대 아니구요.

오류가 나는 지점은, getDataJson으로 서버의 데이터를 가져오는 부분입니다.

사실 이전에도 다른 블로그에서 예제를 그대로 써본적이 있는데, 그때도 php와 연동되는 변수부분에서

nullpoiterexception이 똑같이 나더라구요. 제가 생각할때는 코드 문제가 아니라 기본적인 설정문제가 아닌가 싶은데..

고수님들의 조언부탁드립니다.
humba (140 포인트) 님이 2017년 1월 17일 질문
humba님이 2017년 1월 17일 수정

1개의 답변

0 추천
다른게 문제 있는 부분은 아니고 JSON 데이터가 형식에 맞지 않는것 같네요. 콤마하나 틀려도 익셉션 발생할 수 있습니다.

JSON응답으로 오는 스트링을 그대로 저장했다가 자바로만 변환해봐도 에러날것 같습니다.

혹은 결과값이 없다고 null로 반환해서 발생하는 문제는 아닌지 결과값을 검토해보시면 되겠습니다.

여기 올려주셔두되구요
라쎄린드 (25,460 포인트) 님이 2017년 1월 17일 답변
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = (ListView) findViewById(R.id.listView);
        personList = new ArrayList<HashMap<String,String>>();
        getData("http://localhost/getdata.php");
    }


    protected void showList(){
        try {
            JSONObject jsonObj = new JSONObject(myJSON);
            peoples = jsonObj.getJSONArray(TAG_RESULTS);

            for(int i=0;i<peoples.length();i++){
                JSONObject c = peoples.getJSONObject(i);
                String product_name = c.getString(TAG_NAME);
                String category = c.getString(TAG_CATEGORY);
                String price = c.getString(TAG_PRICE);
                String expiry_date=c.getString(TAG_DATE);
                String barcode_value=c.getString(TAG_BARCOE);


                HashMap<String,String> persons = new HashMap<String,String>();

                persons.put(TAG_NAME, product_name);
                persons.put(TAG_CATEGORY,category);
                persons.put(TAG_PRICE, price);
                persons.put(TAG_DATE, expiry_date);
                persons.put(TAG_BARCOE, barcode_value);

                personList.add(persons);
            }

            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, personList, R.layout.list_item,
                    new String[]{TAG_NAME,TAG_CATEGORY,TAG_PRICE,TAG_DATE,TAG_BARCOE},
                    new int[]{R.id.product_name, R.id.category, R.id.price,R.id.expiry_date, R.id.barcode_value}
            );

            list.setAdapter(adapter);

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    public void getData(String url){
        class GetDataJSON extends AsyncTask<String, Void, String>{

            @Override
            protected String doInBackground(String... params) {

                String uri = params[0];

                BufferedReader bufferedReader = null;
                try {
                    URL url = new URL(uri);
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                    StringBuilder sb = new StringBuilder();

                    bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));

                    String json;
                    while((json = bufferedReader.readLine())!= null){
                        sb.append(json+"\n");
                    }

                    return sb.toString().trim();

                }catch(Exception e){
                    return null;
                }



            }

            @Override
            protected void onPostExecute(String result){
                myJSON=result;
                showList();
            }
        }
        GetDataJSON g = new GetDataJSON();
        g.execute(url);
    }
{"result":[{"prodcut_name":"코카콜라","category":"음료","price":"1000","expiry_date":"2017-12-31","barcode_value":"00000000"},{"prodcut_name":"조지아커피","category":"음료","price":"800","expiry_date":"2018-11-30","barcode_value":"00000001"},
각각 MainActivity의 JSON관련 부분과, .php파일을 웹에 띄웠을때의 결과물입니다.
답글 올려주신직후 확인해봤는데 뭐가 틀린지 알 수가 없네요..  틀린 부분이 있다면 조언부탁드려요
JSON데이터 끝에 ',' 이거 뭔가용??? 마지막에 }]}로 끝나는거 맞지요?
넵넵. 똑같은 데이터들이 여러개있어서 두 행만 가져온거에요. 마지막엔 }]}로 끝나는거 맡구요
String TEST = "{\"result\":[{\"prodcut_name\":\"코카콜라\",\"category\":\"음료\",\"price\":\"1000\",\"expiry_date\":\"2017-12-31\",\"barcode_value\":\"00000000\"},{\"prodcut_name\":\"조지아커피\",\"category\":\"음료\",\"price\":\"800\",\"expiry_date\":\"2018-11-30\",\"barcode_value\":\"00000001\"}]}";

        try {
            JSONObject jsonObj = new JSONObject(TEST);
            JSONArray peoples = jsonObj.getJSONArray("result");

            for(int i=0;i<peoples.length();i++){
                JSONObject c = peoples.getJSONObject(i);
                String product_name = c.getString("prodcut_name");
                String category = c.getString("category");
                String price = c.getString("price");
                String expiry_date=c.getString("expiry_date");
                String barcode_value=c.getString("barcode_value");

                Log.e("JSON", "" + product_name);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

직접 해보니 문제가 없네요;;; 정확하게 스트링이 내려왔다면 문제가 없는 코드라는 뜻입니다.
브레이크 포인트 걸고 하나하나 보실 수 밖에요 ;
어느 라인에서 터지는지 위주로 보시면 금방 문제 찾으실것 같습니다.
혹~시나 인코딩 문제는 아닌지도 보시구요~
마지막으로 개행처리되는(\r\n)등의 문자는 포함된게 아닌지도 확인해보세요
하..사실 이게 본문에 링크된 사이트에 있는 코드를 약간만 변형한거라 코드가 틀릴일은 거의없거든요.. 그래서 설정의 문제라고 생각한건데..
혹시 테스트를 안드로이드 스튜디오 에뮬레이터로 해보신거 맞나요? 특별한 환경설정 추가 없이요?
네 안스 에뮬레이터로 로그찍어봤습니다.
근처 도서관 컴퓨터로 다시 깔고해봤는데 저는 여전히 안되네요..뭐가문제일까요;  제가 mysql의 db구축을 phpmyadmin에서 했는데 혹시 이게 문제일까요?
peoples.length 를 peoples.size로 바꿔보세요.
아니면 peoples.length를 로그로 찍어서 무슨 값이 나오는지 확인해보세요
...