java.lang.NullPointerException

Oi, bom dia.

O app trava lançando esse erro qndo nao tem retorno na busca.
Como posso tratar isso?

O problema está nessa parte pq o JSON está nulo e obviamente a busca do JSONArray tbm

    JSONObject respostaJason = new JSONObject(dadosLivrosJson);
    JSONArray dadosLivroArray = respostaJason.optJSONArray("items");

Segue código completo

public class ProcessarLivros {

    private static final String LOG_TAG = ProcessarLivros.class.getSimpleName();

    public static List<DadosLivro> extrairDadosJson(String dadosLivrosJson)  {

        if (TextUtils.isEmpty(dadosLivrosJson)) {
            return null;
        }

        List<DadosLivro> informacoesLivro = new ArrayList<>();

        try {
            JSONObject respostaJason = new JSONObject(dadosLivrosJson);
            JSONArray dadosLivroArray = respostaJason.optJSONArray("items");

            for (int i = 0; i < dadosLivroArray.length(); i++) {

                JSONObject livroAtual = dadosLivroArray.optJSONObject(i);
                JSONObject informacaoVolume = livroAtual.optJSONObject("volumeInfo");

                String tituloLivro = " ";
                if (informacaoVolume.has("title")) {
                    tituloLivro = informacaoVolume.optString("title");
                }

                JSONObject imagemUrl;
                String urlImagemLivro = " ";
                if (informacaoVolume.has("imageLinks")) {
                    imagemUrl = informacaoVolume.optJSONObject("imageLinks");
                    if (imagemUrl.has("thumbnail")) {
                        urlImagemLivro = imagemUrl.optString("thumbnail");
                    }
                }

                String resenhaLivro = " ";
                JSONObject resumoLivro;
                if (livroAtual.has("searchInfo")) {
                    resumoLivro = livroAtual.optJSONObject("searchInfo");
                    if (resumoLivro.has("textSnippet")) {
                        resenhaLivro = resumoLivro.optString("textSnippet");
                    }
                }

                JSONArray listaAutor = informacaoVolume.optJSONArray("authors");
                String autor = null;

                if (listaAutor != null && listaAutor.length() > 0) {
                    for (int j = 0; j < listaAutor.length(); j++) {
                        autor = listaAutor.optString(j);
                    }
                }

                String ExibirLivroLoja = " ";
                if (informacaoVolume.has("infoLink")) {
                    ExibirLivroLoja = informacaoVolume.optString("infoLink");
                }

                DadosLivro inforLivro = new DadosLivro(tituloLivro, resenhaLivro, autor,
                        urlImagemLivro, ExibirLivroLoja);
                informacoesLivro.add(inforLivro);
            }
        } catch ( JSONException e) {
            Log.e(LOG_TAG, "Problema ao analisar os resultados JSON", e);
        }
        return informacoesLivro;

    }
}

Antes de fazer tudo isso você confere antes se o JSON está nulo, um simples “if” resolve.

https://docs.oracle.com/javase/8/docs/api/?java/lang/NullPointerException.html

Você consegue verificar qual o Json está chegado para você, se possível adiciona aqui. Mas aparentemente “itens” ou não existe ou você está procurando no local incorreto. E como o @Carlos_Gabriel_Goian citou um if resolve e é bem vindo.

1 curtida

Está sendo procurado no local correto, pois quando o usuário informa um nome que tenha em algum livro, a busca funciona e retorna normalmente as opções, qndo a busca não retorna nada, dá esse erro. Um if resolve sim, coloquei para verificar o json e ainda assim o app trava

Boa tarde,
Coloca o strack trace para nós tentarmos visualizar melhor o que está ocorrendo.

Consegui resolver agora, amigo, era uma coisa idiota, cabeça cheia nem pensei.

public class ProcessarLivros {

    private static final String LOG_TAG = ProcessarLivros.class.getSimpleName();

    public static List<DadosLivro> extrairDadosJson(String dadosLivrosJson) {

        if (TextUtils.isEmpty(dadosLivrosJson)) {
            return null;
        }

        List<DadosLivro> informacoesLivro = new ArrayList<>();

        try {

            JSONObject respostaJason = new JSONObject(dadosLivrosJson);

            JSONArray dadosLivroArray = respostaJason.optJSONArray("items");

            if(dadosLivroArray == null){
                return informacoesLivro;
            }

            for (int i = 0; i < dadosLivroArray.length(); i++) {

                JSONObject livroAtual = dadosLivroArray.optJSONObject(i);


                JSONObject informacaoVolume = livroAtual.optJSONObject("volumeInfo");

                String tituloLivro = " ";
                if (informacaoVolume.has("title")) {
                    tituloLivro = informacaoVolume.optString("title");
                }

                JSONObject imagemUrl;
                String urlImagemLivro = " ";
                if (informacaoVolume.has("imageLinks")) {
                    imagemUrl = informacaoVolume.optJSONObject("imageLinks");
                    if (imagemUrl.has("thumbnail")) {
                        urlImagemLivro = imagemUrl.optString("thumbnail");
                    }
                }

                String resenhaLivro = " ";
                JSONObject resumoLivro;
                if (livroAtual.has("searchInfo")) {
                    resumoLivro = livroAtual.optJSONObject("searchInfo");
                    if (resumoLivro.has("textSnippet")) {
                        resenhaLivro = resumoLivro.optString("textSnippet");
                    }
                }

                JSONArray listaAutor = informacaoVolume.optJSONArray("authors");
                String autor = null;

                if (listaAutor != null && listaAutor.length() > 0) {
                    for (int j = 0; j < listaAutor.length(); j++) {
                        autor = listaAutor.optString(j);
                    }
                }

                String ExibirLivroLoja = " ";
                if (informacaoVolume.has("infoLink")) {
                    ExibirLivroLoja = informacaoVolume.optString("infoLink");
                }

                DadosLivro inforLivro = new DadosLivro(tituloLivro, resenhaLivro, autor,
                        urlImagemLivro, ExibirLivroLoja);
                informacoesLivro.add(inforLivro);
            }
        } catch (JSONException e) {
            Log.e(LOG_TAG, "Problema ao analisar os resultados JSON", e);
        }
        return informacoesLivro;

    }
}

depois só tratei em outra classe no Loader rs

  @Override
    public void onLoadFinished(android.content.Loader<List<DadosLivro>> loader, List<DadosLivro>
            informacoesLivros) {

        View indicadorProcessamento = findViewById(R.id.indicadorProcessamento);
        indicadorProcessamento.setVisibility(View.GONE);

        mAdapter.clear();

        if (informacoesLivros != null && !informacoesLivros.isEmpty()) {
            mAdapter.addAll(informacoesLivros);
        } else{
            mEstadoVazioTextView.setBackgroundResource(R.drawable.notificacao_sem_resulltado);
            mEstadoVazioTextView.setText(getString(R.string.sem_resultados_livro));

        }
    }
1 curtida