【问题标题】:HTTP GET Request Returning Null? (Java)HTTP GET 请求返回 Null? (爪哇)
【发布时间】:2016-11-08 02:49:53
【问题描述】:

我正在使用以下代码创建一个 HTTP GET 请求:

URL obj = new URL(pl.getConfig().getString("Database URL") + player.getName());
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        Logger.getLogger("Minecraft").info(inputLine); //Logs null

        Gson gsonData = new Gson();
        MinecladJson jsonData = gsonData.fromJson(inputLine, MinecladJson.class); //Returns null (because inputLine is null)
        PlayerData jsonPlayerData = jsonData.getPlayer(); //Crash here

不幸的是,变量inputLine 似乎为空,导致我的代码中出现 NullPointerException。更糟糕的是,该地址在我的浏览器中运行良好并返回:

{"player":{"balance":0,"permissions":["ultracosmetics.recievechest","ultracosmetics.openmenu"],"stats":{"playerKills":0,"deaths":0,"minutesPlayed":0},"achievements":{"firstJoin":false},"joinMessage":"&8[&9&l+&r&8] %r&7%p","leaveMessage":"&8[&9&l-&r&8] %r&7%p","rank":"default","firstJoin":"2016-07-01T02:37:14.458Z"},"content":{"chatFormat":"%r&7%p: %m","chatCensor":["testcensor"],"chatPrefixes":{"mage":"&5MAGE ","warrior":"&3WARRIOR ","chief":"&2CHIEF ","sage":"&7SAGE ","default":"","developer":"&9&lDEV ","moderator":"&6MOD "},"currencyName":"Coins","saveRate":30000,"cacheResetRate":1200000,"allowedCharacters":"abcdefghijklmnopqrstuvwxyz0123456789!~*.,/][()=+@#$%\"';:_`^&{}\\|<>?","tabHeader":"&8&lMineclad &r&9Network","tabFooter":"&7Mineclad.co"},"uuid":"559f6d32c2b740c9bc843dd54a55b39c"}

堆栈跟踪:

[09:16:54 WARN]: java.lang.NullPointerException
[09:16:54 WARN]:    at com.techurify.minecladPlugin.event.player.PlayerJoinListener.onPlayerJoin(PlayerJoinListener.java:56)
[09:16:54 WARN]:    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[09:16:54 WARN]:    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[09:16:54 WARN]:    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[09:16:54 WARN]:    at java.lang.reflect.Method.invoke(Method.java:483)
[09:16:54 WARN]:    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:300)
[09:16:54 WARN]:    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[09:16:54 WARN]:    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:501)
[09:16:54 WARN]:    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:486)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.PlayerList.onPlayerJoin(PlayerList.java:317)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.PlayerList.a(PlayerList.java:144)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.LoginListener.b(LoginListener.java:115)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.LoginListener.E_(LoginListener.java:53)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.NetworkManager.a(NetworkManager.java:224)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.ServerConnection.c(SourceFile:187)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:762)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:360)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:646)
[09:16:54 WARN]:    at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:550)
[09:16:54 WARN]:    at java.lang.Thread.run(Thread.java:745)

我想知道:

  1. 为什么会这样
  2. 以及如何解决它

【问题讨论】:

  • 请显示完整的堆栈跟踪并在您的代码中指出异常发生的行。
  • 在这段代码中inputLine 不可能为空,除非在读取循环结束时,您不再使用它。
  • @EJP 是的,这就是我很困惑的原因。
  • @JimGarrison 更新了!
  • 是的,我登录了inputLine,它是空的。 jsonData 为空,因为 inputLine 为空。在文档中它说:返回:an object of type T from the string. Returns null if json is null.

标签: java json http url


【解决方案1】:

我相信而不是

MinecladJson jsonData = gsonData.fromJson(inputLine, MinecladJson.class);

你想要

MinecladJson jsonData = gsonData.fromJson(response.toString(), MinecladJson.class);
                                          ^^^^^^^^^^^^^^^^^^^

您将单个响应行累积到 response,但随后尝试从 inputLine 中提取对象,此时将始终为 null

【讨论】:

    【解决方案2】:

    您正在记录inputLine,但我假设您想记录response

    对于离开 while 循环 inputLine 必须为 null,因此我难怪您在打印 inputLine 时得到该结果:

        StringBuffer response = new StringBuffer();
    
        while ((inputLine = in.readLine()) != null) { 
            // leave while loop if inputLine == in.readLine() == null
    
            response.append(inputLine);
        }
        in.close();
        Logger.getLogger("Minecraft").info(inputLine); //Logs null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-30
      • 2020-12-12
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多