0

我在使用 JSON 对象从 Google Books API 检索诸如书名之类的信息时遇到了一些问题。下面是相关代码:

//Retrieves scanned data from barcode reader
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (scanningResult != null) {
        String scanContent = scanningResult.getContents();
        String scanFormat = scanningResult.getFormatName();

        if(scanContent!=null && scanFormat!=null && scanFormat.equalsIgnoreCase("EAN_13")){
            String bookSearchString = "https://www.googleapis.com/books/v1/volumes?" +
                    "q=isbn:"+scanContent+"&key=564967988072"; //my key
            new GetBookInfo().execute(bookSearchString);

            String booktitle = booktitleText.getText().toString();
            BookGenActivity.setBookTitle(booktitle);

        }
        else{
                Toast toast = Toast.makeText(getApplicationContext(), 
                    "Not a valid scan!", Toast.LENGTH_SHORT);
                    toast.show();
        }           

    }
    else{
        Toast noData = Toast.makeText(getApplicationContext(), 
            "No scan data received!", Toast.LENGTH_SHORT);
        noData.show();
    }

}

这是获取书籍信息的类:

    private class GetBookInfo extends AsyncTask<String, Void, String> {
    //fetch book info
    @Override
    protected String doInBackground(String... bookURLs) {
    //request book info
        StringBuilder bookBuilder = new StringBuilder();
        for (String bookSearchURL : bookURLs) {
            //search urls
            HttpClient bookClient = new DefaultHttpClient();
            try {
                //get the data
                HttpGet bookGet = new HttpGet(bookSearchURL);
                HttpResponse bookResponse = bookClient.execute(bookGet);
                StatusLine bookSearchStatus = bookResponse.getStatusLine();
                if (bookSearchStatus.getStatusCode()==200) {
                    //we have a result
                    HttpEntity bookEntity = bookResponse.getEntity();
                    InputStream bookContent = bookEntity.getContent();
                    InputStreamReader bookInput = new InputStreamReader(bookContent);
                    BufferedReader bookReader = new BufferedReader(bookInput);
                    String lineIn;
                    while ((lineIn=bookReader.readLine())!=null) {
                        bookBuilder.append(lineIn);
                    }

                }

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

        }
        return bookBuilder.toString();

    }

    protected void onPostExecute(String result) {
        //parse search results
        try{
            //parse results
            JSONObject resultObject = new JSONObject(result);
            JSONArray bookArray = resultObject.getJSONArray("items");
            JSONObject bookObject = bookArray.getJSONObject(0);
            JSONObject volumeObject = bookObject.getJSONObject("volumeInfo");

            try{ 
                bookTextView.setText("TITLE: "+volumeObject.getString("title"));

            }
            catch(JSONException jse){ 
                booktitleText.setText("Not Found");
                jse.printStackTrace(); 
            }
        }
        //If no result is found
        catch (Exception e) {
            //no result
            e.printStackTrace();
            bookTextView.setText("NOT FOUND");
        }

    }

}

在我扫描条形码并且应用程序崩溃后似乎出现 NullPointerException,但我无法找出原因。下面是堆栈跟踪:

08-02 11:34:56.171: W/System.err(6994): org.json.JSONException: End of input at character 0 of 
08-02 11:34:56.171: W/System.err(6994):     at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
08-02 11:34:56.171: W/System.err(6994):     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
08-02 11:34:56.171: W/System.err(6994):     at org.json.JSONObject.<init>(JSONObject.java:155)
08-02 11:34:56.171: W/System.err(6994):     at org.json.JSONObject.<init>(JSONObject.java:172)
08-02 11:34:56.171: W/System.err(6994):     at com.myapps.bscanr.BookActivity$GetBookInfo.onPostExecute(BookActivity.java:128)
08-02 11:34:56.171: W/System.err(6994):     at com.myapps.bscanr.BookActivity$GetBookInfo.onPostExecute(BookActivity.java:1)
08-02 11:34:56.171: W/System.err(6994):     at android.os.AsyncTask.finish(AsyncTask.java:632)
08-02 11:34:56.171: W/System.err(6994):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-02 11:34:56.171: W/System.err(6994):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
08-02 11:34:56.171: W/System.err(6994):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-02 11:34:56.171: W/System.err(6994):     at android.os.Looper.loop(Looper.java:136)
08-02 11:34:56.171: W/System.err(6994):     at android.app.ActivityThread.main(ActivityThread.java:5001)
08-02 11:34:56.171: W/System.err(6994):     at java.lang.reflect.Method.invokeNative(Native Method)
08-02 11:34:56.171: W/System.err(6994):     at java.lang.reflect.Method.invoke(Method.java:515)
08-02 11:34:56.171: W/System.err(6994):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-02 11:34:56.171: W/System.err(6994):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-02 11:34:56.171: W/System.err(6994):     at dalvik.system.NativeStart.main(Native Method)
08-02 11:34:56.171: D/AndroidRuntime(6994): Shutting down VM
08-02 11:34:56.171: W/dalvikvm(6994): threadid=1: thread exiting with uncaught exception (group=0x4159dba8)
08-02 11:34:56.171: E/AndroidRuntime(6994): FATAL EXCEPTION: main
08-02 11:34:56.171: E/AndroidRuntime(6994): Process: com.myapps.bscanr, PID: 6994
08-02 11:34:56.171: E/AndroidRuntime(6994): java.lang.NullPointerException
08-02 11:34:56.171: E/AndroidRuntime(6994):     at com.myapps.bscanr.BookActivity$GetBookInfo.onPostExecute(BookActivity.java:168)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at com.myapps.bscanr.BookActivity$GetBookInfo.onPostExecute(BookActivity.java:1)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at android.os.AsyncTask.finish(AsyncTask.java:632)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at android.os.Looper.loop(Looper.java:136)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at android.app.ActivityThread.main(ActivityThread.java:5001)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at java.lang.reflect.Method.invokeNative(Native Method)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at java.lang.reflect.Method.invoke(Method.java:515)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-02 11:34:56.171: E/AndroidRuntime(6994):     at dalvik.system.NativeStart.main(Native Method)

对此的任何指导将不胜感激!

4

0 回答 0