[Gelöst] Fehler beim Serialisieren mit GSON

Wenn ihr bei eurem Plugin nicht weiter kommt, könnt ihr hier euer Problem beschreiben und um Hilfe bitten.

[Gelöst] Fehler beim Serialisieren mit GSON

Beitragvon Sep2703 » Fr 20. Feb 2015, 18:49

Hey,

ich programmiere gerade ein Grundstück-Plugin (Claims).
Dabei möchte ich eine Klasse mit GSON serialisieren und im JSON-Format abspeichern.
Nur bin ich schon total genervt, weil ich immer eine NullPointerException bekomme und die Herkunft nicht allzu viel aussagt.

Zunächst mein Stacktrace:
Code: Alles auswählen
  1. [18:44:39] [Server thread/ERROR]: Error occurred while enabling Claims v0.1 (Is it up to date?)
  2. java.lang.NullPointerException
  3.    at de.janhektor.claims.io.ClaimIO.load(ClaimIO.java:68) ~[?:?]
  4.    at de.janhektor.claims.ClaimPlugin.onEnable(ClaimPlugin.java:31) ~[?:?]
  5.    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigot.jar:git-Spigot-2b97a38-e8efbb8]
  6.    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:335) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  7.    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  8.    at org.bukkit.craftbukkit.v1_8_R1.CraftServer.loadPlugin(CraftServer.java:354) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  9.    at org.bukkit.craftbukkit.v1_8_R1.CraftServer.enablePlugins(CraftServer.java:314) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  10.    at net.minecraft.server.v1_8_R1.MinecraftServer.q(MinecraftServer.java:402) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  11.    at net.minecraft.server.v1_8_R1.MinecraftServer.k(MinecraftServer.java:370) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  12.    at net.minecraft.server.v1_8_R1.MinecraftServer.a(MinecraftServer.java:325) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  13.    at net.minecraft.server.v1_8_R1.DedicatedServer.init(DedicatedServer.java:211) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  14.    at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:494) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  15.    at java.lang.Thread.run(Unknown Source) [?:1.8.0_25]

UND
Code: Alles auswählen
  1. java.lang.NullPointerException
  2.    at de.janhektor.claims.io.ClaimIO.save(ClaimIO.java:43) ~[?:?]
  3.    at de.janhektor.claims.io.ClaimIO$1.run(ClaimIO.java:30) ~[?:?]
  4.    at org.bukkit.craftbukkit.v1_8_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot.jar:git-Spigot-2b97a38-e8efbb8]
  5.    at org.bukkit.craftbukkit.v1_8_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  6.    at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:694) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  7.    at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:316) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  8.    at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:623) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  9.    at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:526) [spigot.jar:git-Spigot-2b97a38-e8efbb8]
  10.    at java.lang.Thread.run(Unknown Source) [?:1.8.0_25]


So ... jetzt lege ich noch den entsprechenden Code bei.

ClaimIO
Code: Alles auswählen
  1. package de.janhektor.claims.io;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import org.bukkit.Bukkit;
  9. import org.bukkit.craftbukkit.libs.com.google.gson.Gson;
  10. import de.janhektor.claims.Claim;
  11. import de.janhektor.claims.ClaimPlugin;
  12. public class ClaimIO {
  13.    private File file;
  14.    private Gson gson;
  15.    private ClaimPlugin plugin;
  16.    
  17.    public ClaimIO(ClaimPlugin plugin) {
  18.       this.plugin = plugin;
  19.       this.file = new File(plugin.getDataFolder(), "claims.json");
  20.       Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {
  21.          
  22.          @Override
  23.          public void run() {
  24.             save();
  25.             load();
  26.             Bukkit.broadcastMessage("§3Claims re-loaded!");
  27.          }
  28.       }, 20 * 10L, 20 * 30L);
  29.    }
  30.    
  31.    public void save() {
  32.       try {
  33.          if (!file.exists()) file.createNewFile();
  34.          FileWriter writer = new FileWriter(file);
  35.          
  36.          ClaimCollection claims = new ClaimCollection(plugin.claims);
  37.          String json = gson.toJson(claims);
  38.          writer.write(json);
  39.          writer.flush();
  40.          writer.close();
  41.       } catch (IOException ex) {
  42.          ex.printStackTrace();
  43.       }
  44.    }
  45.    
  46.    public void load() {
  47.       plugin.claims.clear();
  48.       try {
  49.          if (!file.exists()) {
  50.             file.createNewFile();
  51.             return;
  52.          }
  53.          FileReader fileReader = new FileReader(file);
  54.          BufferedReader reader = new BufferedReader(fileReader);
  55.          StringBuilder contentBuilder = new StringBuilder();
  56.          String line = null;
  57.          while ((line = reader.readLine()) != null) {
  58.             contentBuilder.append(line);
  59.          }
  60.          reader.close();
  61.          fileReader.close();
  62.          ClaimCollection claims = gson.fromJson(contentBuilder.toString(), ClaimCollection.class);
  63.          plugin.claims = new ArrayList<Claim>();
  64.          claims.getClaims().forEach((sc) -> plugin.claims.add(SerializableClaim.getClaim(sc)));
  65.       } catch (IOException ex) {
  66.          ex.printStackTrace();
  67.       }
  68.    }
  69. }



ClaimCollection
Code: Alles auswählen
  1. package de.janhektor.claims.io;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import de.janhektor.claims.Claim;
  5. public class ClaimCollection {
  6.    private List<SerializableClaim> claims;
  7.    
  8.    public ClaimCollection(List<Claim> claims) {
  9.       this.claims = new ArrayList<SerializableClaim>();
  10.       claims.forEach((claim) -> this.claims.add(new SerializableClaim(claim)));
  11.    }
  12.    
  13.    public ClaimCollection() {
  14.       // TODO Auto-generated constructor stub
  15.    }
  16.    
  17.    public List<SerializableClaim> getClaims() {
  18.       return claims;
  19.    }
  20.    
  21.    public void setClaims(List<SerializableClaim> claims) {
  22.       this.claims = claims;
  23.    }
  24. }



SerializableClaim
Code: Alles auswählen
  1. package de.janhektor.claims.io;
  2. import java.util.List;
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.Location;
  5. import de.janhektor.claims.Claim;
  6. public class SerializableClaim {
  7.    private int minX, minY, minZ;
  8.    private int maxX, maxY, maxZ;
  9.    private String world;
  10.    private String owner;
  11.    private List<String> members;
  12.    
  13.    public SerializableClaim(Claim c) {
  14.       this.minX = c.getMinX();
  15.       this.minY = c.getMinY();
  16.       this.minZ = c.getMinZ();
  17.       this.maxX = c.getMaxX();
  18.       this.maxY = c.getMaxY();
  19.       this.maxZ = c.getMaxZ();
  20.       this.world = c.getSerializeWorld();
  21.       this.owner = c.getOwner();
  22.       this.members = c.getMembers();
  23.    }
  24.    
  25.    public SerializableClaim() {
  26.       // TODO Auto-generated constructor stub
  27.    }
  28.    
  29.    public static Claim getClaim(SerializableClaim sc) {
  30.       Claim c = new Claim(new Location(Bukkit.getWorld(sc.world), sc.minX, sc.minY, sc.minZ),
  31.             new Location(Bukkit.getWorld(sc.world), sc.maxX, sc.maxY, sc.maxZ), sc.owner, sc.members);
  32.       return c;
  33.    }
  34.    
  35. }



Claim
Code: Alles auswählen
  1. package de.janhektor.claims;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.bukkit.Location;
  5. public class Claim extends Region {
  6.    private String owner;
  7.    private List<String> members;
  8.    
  9.    public Claim(Location loc1, Location loc2, String owner) {
  10.       super(loc1, loc2);
  11.       this.owner = owner;
  12.       this.members = new ArrayList<String>();
  13.    }
  14.    
  15.    public Claim(Location loc1, Location loc2, String owner, List<String> members) {
  16.       super(loc1, loc2);
  17.       this.owner = owner;
  18.       this.members = members;
  19.    }
  20.    
  21.    public String getOwner() {
  22.       return owner;
  23.    }
  24.    
  25.    public List<String> getMembers() {
  26.       return members;
  27.    }
  28. }




Würde mich echt freuen, wenn ihr mir da etwas helfen könnt.

Sep2703 / Janhektor



EDIT

Ich habe 4 Stunden nach dem Fehler gesucht, hier diesen Post erstellt und diverse Änderungen und Debug-Maßnahmen am Code durchgeführt.
Und wo lag nun der Fehler?
Ich habe vergessen, die gson-Variable zu initialisieren!
Folgende Zeile hat letztendlich Abhilfe geschaffen:
Code: Alles auswählen
  1. this.gson = new Gson();


Damit ist das Thema wohl abgeschlossen.
Du möchtest programmieren lernen oder dein Bukkit-/Spigot-Wissen erweitern?
Hier habe ich für dich kostenlose Tutorials: https://youtube.com/janhektor
Benutzeravatar
Sep2703
 
Beiträge: 677
Registriert: Mi 8. Jan 2014, 15:13
Wohnort: 127.0.0.1

Zurück zu Hilfe und Support

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 Gäste

cron