3
respostas

[Dúvida] Tratamento das exceções não funciona como o mostrado

Meu código tá igual ao mostrado na aula mas o resultado do tratamento das exceções tá diferente. Aparentemente tá retornando um erro de JSON pq ele espera um objeto mas retorna um array vazio. Não sei como consertar isso, e achei estranho que no código da professora não aconteceu isso :( Tem alguma solução??

Output do erro:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:397)
    at com.google.gson.Gson.fromJson(Gson.java:1227)
    at com.google.gson.Gson.fromJson(Gson.java:1137)
    at com.google.gson.Gson.fromJson(Gson.java:1047)
    at com.google.gson.Gson.fromJson(Gson.java:982)
    at br.com.alura.alugames.servicos.ConsumoApi.buscaJogo(ConsumoApi.kt:25)
    at br.com.alura.alugames.principal.MainKt.main(Main.kt:28)
    at br.com.alura.alugames.principal.MainKt.main(Main.kt)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:393)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:386)
    ... 7 more

Tratamento da exceção:

val buscaApi = ConsumoApi()
    val informacaoJogo = buscaApi.buscaJogo(busca)

    // inicializar variável meuJogo em escopo global
    var meuJogo: Jogo? = null

    val resultado = runCatching {
        // reatribuir valor de `meuJogo`
        meuJogo = Jogo(informacaoJogo.info.title, informacaoJogo.info.thumb)
    }

    // ESSE PRINT NÃO APARECE MESMO QUANDO FALHA ===============================================================
    resultado.onFailure {
         println("br.com.alura.alugames.modelo.Jogo inexistente. Tente outro ID.")
    }

    resultado.onSuccess {
        println("Deseja inserir descrição personalizada? [S/N] ")
        val opcao = leitura.nextLine()

        if (opcao.equals("s", true)) {
            println("Insira a descrição personalizada para o jogo: ")
            val descricaoPersonalizada = leitura.nextLine()
            meuJogo?.descricao = descricaoPersonalizada

        } else {
            meuJogo?.descricao = meuJogo?.titulo
        }
        println(meuJogo)
    }

    resultado.onSuccess { println("Busca finalizada com sucesso.") }
3 respostas

Olá, Ana.

Tudo bem?

O erro que você está recebendo é devido ao fato de que o código está esperando um objeto JSON, mas está recebendo um array JSON.

Pelo que eu entendi do seu código e do erro, parece que a chamada da API está retornando um array JSON vazio, em vez de um objeto JSON. Isso pode estar acontecendo por vários motivos, como por exemplo, o endpoint da API que você está chamando pode ter mudado ou a API pode estar temporariamente indisponível.

Uma solução possível para esse problema seria adicionar um tratamento de exceção específico para JsonSyntaxException. Isso poderia ser feito da seguinte maneira:

val resultado = runCatching {
    // reatribuir valor de `meuJogo`
    meuJogo = Jogo(informacaoJogo.info.title, informacaoJogo.info.thumb)
}.onFailure { exception ->
    if (exception is JsonSyntaxException) {
        println("Erro na conversão do JSON. Verifique a estrutura do JSON retornado.")
    } else {
        println("br.com.alura.alugames.modelo.Jogo inexistente. Tente outro ID.")
    }
}

Dessa forma, se a exceção for uma JsonSyntaxException, uma mensagem de erro diferente será impressa, indicando que o problema está na conversão do JSON. Isso pode te ajudar a identificar melhor o problema.

No entanto, é importante notar que essa é apenas uma sugestão e pode não resolver completamente o seu problema, pois o erro pode estar sendo causado por outros fatores não visíveis no código que você compartilhou.

Espero ter ajudado e bons estudos!

Oi Renan! Eu copiei e colei exatamente igual ao código que vc informou, mas ainda assim o erro continua: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mensagem do erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá, eu também estou passando pelo mesmo problema. Ainda estou na aula 2: Modelando a aplicação na parte 08: Desserializando dados do JSON. A API esta retornando essa mesma Exception na linha do Gson. Gostaria de saber qual a previsão de conserto disso no curso de formação Kotlin?