I'm currently working on a small minecraft spigot plugin, which needs to save data. I have chosen to use a .yml file to do so and have programmed both saving and loading the data, however the loading does not work.
this is the Command being run:
package steckbrief.steckbrief.Commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import steckbrief.steckbrief.DataHolderect.DataHolder;
import java.util.ArrayList;
public class getSteckbrief implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String [] args){
DataHolder zw = new DataHolder(new ArrayList<String[]>(), new ArrayList<String>());
zw.LoadDataHolder(new String[0]);
if(zw.names.contains(args[0])) { //prüft ob der gefragte Spieler in der VerzeichnisListe "names" existiert
int index = zw.names.indexOf(args[0]);
String[] sent = zw.arrays.get(index);
sender.sendMessage("Steckbrief von: " + args[0]);
sender.sendMessage("Name: " + sent[0]);
sender.sendMessage("Beruf: " + sent[1]);
sender.sendMessage("Alter: " + sent[2]);
sender.sendMessage("Zusatz: " + sent[3]);
return true;
} else {
sender.sendMessage(args[0] + " ist nicht da, bzw. hat keinen Steckbrief");
return true;
}
}
}
this is my DataHolder class (saveDataHolder works fine, i tested with another command)
package steckbrief.steckbrief.Commands;
import java.util.List;
import org.yaml.snakeyaml.Yaml;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileWriter;
public class DataHolder {
public List<String> names;
public List<String[]> arrays;
public DataHolder(List<String[]> arrays, List<String> names) {
this.arrays = arrays;
this.names = names;
}
public void LoadDataHolder(String[] args) {
// Create a new instance of the Yaml class
Yaml yaml = new Yaml();
// Read the data from the .yml file
try (FileReader reader = new FileReader("data.yml")) {
try {
DataHolder dataHolder = yaml.load(reader);
// You can now use the arrays as needed
this.names = dataHolder.names;
this.arrays = dataHolder.arrays;
} catch(Exception e){
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void saveDataHolder(String[] args) {
// Create a new instance of the Yaml class
Yaml yaml = new Yaml();
// Create a new DataHolder object to hold the list of arrays
DataHolder dataHolder = new DataHolder(arrays,names);
// Save the data to a .yml file
try (FileWriter writer = new FileWriter("data.yml")) {
yaml.dump(dataHolder, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
but when the loadDataHolder method is run the console gives this Error:
[01:12:50 INFO]: AnimatingLion issued server command: /Steckbrief animatingLion
[01:12:50 WARN]: Can't construct a java object for tag:yaml.org,2002:steckbrief.steckbrief.Commands.DataHolder; exception=Class not found: steckbrief.steckbrief.Commands.DataHolder
in 'reader', line 1, column 1:
!!steckbrief.steckbrief.Commands ...
^
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:313)
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:207)
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:196)
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:161)
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:147)
[01:12:50 WARN]: at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:524)
[01:12:50 WARN]: at org.yaml.snakeyaml.Yaml.load(Yaml.java:467)
[01:12:50 WARN]: at steckbrief.steckbrief.DataHolderect.DataHolder.LoadDataHolder(DataHolder.java:26)
[01:12:50 WARN]: at steckbrief.steckbrief.Commands.getSteckbrief.onCommand(getSteckbrief.java:17)
[01:12:50 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[01:12:50 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[01:12:50 WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1401)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1236)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[01:12:50 WARN]: at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
[01:12:50 WARN]: at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[01:12:50 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[01:12:50 WARN]: at java.base/java.lang.Thread.run(Thread.java:833)
[01:12:50 WARN]: Caused by: org.yaml.snakeyaml.error.YAMLException: Class not found: steckbrief.steckbrief.Commands.DataHolder
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.Constructor.getClassForNode(Constructor.java:642)
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.getConstructor(Constructor.java:298)
[01:12:50 WARN]: at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:308)
[01:12:50 WARN]: ... 24 more
As you can see it's a ClassNotFound Exception, however the DataHolder class is inside the Commands package
Also this is the .yml File
!!steckbrief.steckbrief.Commands.DataHolder
arrays:
- ['chris ', 'inf ', '15 ', 'ich mag hasen ']
names: [AnimatingLion]
I have tried updating snakeyaml I have tried correcting the classpath, although i'm new so idk if i did it right I have verified, that there is nothing wrong with the .yml file (correct place, syntax and name etc.) As mentioned I' new and only know the little bits of java i have learned in school (nothing about projects just how to use logic operations) so i'm at the end of my knowledge. The loadDataHolder is supposed to copy "names" and "arrays" from the .yml file to itself so i can work with it. sincerely Christian Walter PS english is not my first language so please excuse any spelling and grammar mistakes.