3
respostas

[bug] Lidando com Exceções

Durante a aula surgiu esse erro, que ocorre pq a API estava retornando um array vazio em alguns jogos pesquisados ao invés de um objeto, gerando assim o seguinte erro abaixo:

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 MainKt.main(Main.kt:28)
    at 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)
    ... 6 more
    

Segue abaixo o código de resolução para o erro:

  val gson = Gson()

    val meuInfoJogo = try {
        gson.fromJson(json, InfoJogo::class.java)
    } catch (ex: JsonSyntaxException) {
        null
    }

    if (meuInfoJogo != null) {
        try {
            val meuJogo = Jogo(
                meuInfoJogo.info.title,
                meuInfoJogo.info.thumb
            )
            println(meuJogo)
        } catch (ex: NullPointerException) {
            println("Erro ao processar dados do jogo.")
        }
    } else {
        println("Jogo inexistente! Tente outro código.")
    }
3 respostas

Maneiro! Eu fiz de um outro jeito. Mas sinto que o seu ficou um pouco mais limpo por estar tratando cada exceção individualmente.

val gson = Gson()

    try {
        val meuInfoJogo =  gson.fromJson(json, InfoJogo::class.java)
        val meuJogo = Jogo(meuInfoJogo.info.title, meuInfoJogo.info.thumb)

        println(meuJogo)
    } catch (ex: JsonSyntaxException) {
        println("Retorno vazio. Tente outro id.")
    } catch (ex: NullPointerException) {
        println("Jogo inexistente. Tente outro id.")
    }

Eu estava com o mesmo problema mas graças a vocês consegui passar por isso, mas surgiu algumas dúvidas (ainda sou bem leigo na programação), porque esse problema surgiu conosco mas com a moça do video não? Além disso, ao meu ver (talvez eu esteja errado), não resolvemos o problema mas sim apenas identificamos, mas haveria uma forma de resolver esse problema de objeto x array? Até porque (posso estar enganado novamente), o nullpointerexception não faz sentido estar no código, já que sempre que pesquisarmos um jogo inexistente ele irá direto para o JsonSyntaxException pois esse problema surge "primeiro" e dessa forma invalida todo o resto....

Seu ponto tem sentido. Mas esse jeito do try catch a gente está tratando as exceções pontualmente, então vc está dando uma saída para quando aquilo acontecer. O nosso erro é diferente do dela porque a resposta da API é diferente, no caso dela ocorre a instância do meuJogo, ela recebe um NULL no title, mas o Gson consegue gerar um objeto. No nosso caso o Gson não consegue instanciar o objeto meuInfoJogo, porque o formato do JSON é diferente do que estamos esperando, por isso o erro JsonSyntaxException. Na aula seguinte fica mais claro como resolver essas exceções que não está esperando.