这可能是一个新手问题。我将我的.json解析成一个hashmap时遇到了麻烦我可以轻松地编写json文件,这就是我所知道的,它是正确编写的,但加载它时我得到了一个错误:
Caused by: java.lang.InstantiationException: java.lang.Class<com.johnny.gamerpg.inventoryController$Weapon> has no zero argument constructor
Caused by: com.badlogic.gdx.utils.SerializationException: Class cannot be created (non-static member class): com.johnny.gamerpg.inventoryController$Weapon
Caused by: com.badlogic.gdx.utils.reflect.ReflectionException: Could not instantiate instance of class: com.johnny.gamerpg.inventoryController$Weapon
我相信我确实有一个零构造函数,并且这些类设置正确,因为我使用它们来编写.json。
以下是这些课程。
public class item {
public String name;
public item() {}
}
public class Weapon extends item {
int damageMin = 9;
int damageMax = 15;
int priceBuy = 1;
int priceSell = 2;
public Weapon() {}
}
public class Sword extends Weapon{
public Sword() {}
}
public class Dagger extends Weapon{
public Dagger() {}
}
private FileHandle file = Gdx.files.local("items.json");
private HashMap<String, item> items = new HashMap<String, item>();
private void load(){
Json json = new Json();
items = json.fromJson(HashMap.class, file);
}
我已经四处寻找并且没有发现任何类似的东西。所以这可能意味着我做一些愚蠢的事情!无论如何这里是Json文件即时阅读,感谢任何建议将是惊人的。
{
"SwordOfDeath": {
"class": "com.johnny.gamerpg.inventoryController$Sword",
"name": "Sword of Death",
"damageMax": 15,
"damageMin": 2,
"priceBuy": 1,
"priceSell": 2
},
"DaggerOfDeath": {
"class": "com.johnny.gamerpg.inventoryController$Dagger",
"name": "Dagger of Death",
"damageMax": 15,
"damageMin": 2,
"priceBuy": 1,
"priceSell": 2
}
}
谢谢!
编辑: 进口, 包com.johnny.gamerpg;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonWriter;
import java.util.HashMap;
答案 0 :(得分:1)
根据堆栈跟踪,Weapon
是inventoryController
内的嵌套类。根据您的代码,它没有标记为static
,而是标记为公共内部类。
这意味着需要实例化inventoryController
才能实例化Weapon
,这就是为什么你得到零参数构造函数异常的原因
顺便说一下,inventoryController
应为InventoryController
声明它是静态的,你有它:)
答案 1 :(得分:1)
如果你仔细查看错误,你会发现他们引用了一个&#34; (non-static member class)
&#34; - 将你的课程放在他们自己的文件中,它应该有效
你可以做的另一件事(如果你想使用GWT会对你有帮助)就是开始使用像ObjectMap
这样的libGDX数据结构 - 它们似乎可以更好地与libGDX解析器配合使用,并且针对游戏进行了优化。 / p>
最后,看起来你似乎要为游戏中的每件武器创建课程 - 你可能想要考虑保留你的武器&#34;上课然后传递数据,使其变成剑或匕首或工作人员或AK47或其他什么。在软件开发中,我们称之为&#34; Composition over Inheritance&#34;。