【发布时间】:2018-07-18 08:52:30
【问题描述】:
我在java中做了一个小的httpserver,你知道它应该是静态的,我需要一个小型数据库,所以决定做一个内存数据库。问题是数据库类应该是静态的才能在服务器内部使用它。
所以我改变了主意,尝试将数据存储在 json 文件中,每次需要数据时,只需从文件中读取即可。为了简短起见,我需要使用一个数组列表。它在构造函数中初始化。但是当涉及到使用它时,它是空的:|
这是我的代码:
public class DbContext {
private ArrayList<Player> players;
public DbContext() {
this.players = new ArrayList<>();
readPlayer();
}
public Player getPlayerByIds(long id, long boardId) {
for (Player p : players) {
if (p.getBoardId() == boardId && p.getId() == id) {
writePlayer();
return p;
}
}
return null;
}
public boolean updatePlayer(Player player) {
for (Player p : players) {
if (p.getId() == player.getId()) {
p = player;
writePlayer();
return true;
}
}
return false;
}
public void addPlayer(Player player) {
players.add(player);
writePlayer();
}
private boolean playerExists(Player player) {
for (Player p : players) {
if (p.getId() == player.getId()) {
return true;
}
}
return false;
}
private void readPlayer() {
Gson gson = new Gson();
try {
BufferedReader br = new BufferedReader(new FileReader("players.json"));
if (br.read() > 0) {
players = gson.fromJson(br, new TypeToken<ArrayList<Player>>() {
}.getType());
}
} catch (FileNotFoundException ex) {
Logger.getLogger(DbContext.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(DbContext.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void writePlayer() {
Gson gson = new Gson();
try (FileWriter writer = new FileWriter("players.json")) {
gson.toJson(players, writer);
writer.flush();
writer.close();
} catch (IOException ex) {
Logger.getLogger(DbContext.class.getName()).log(Level.SEVERE, null, ex);
}
}
任何帮助或建议将不胜感激。谢谢大家
【问题讨论】:
-
您正在为它分配一个值 -
players = gson.fromJson(br, new TypeToken<ArrayList<Player>>() {}.getType());- 也许该值为 null。 -
基于@Eran 的评论,使
players成员final并使用List.clear()和List.addAll()这样你可能会得到一个NullPointerException,但是你知道你的问题可能在哪里谎言 -
是的,不要在构造函数中初始化你的arraylist,它没有必要,因为你用 line player = gson.fromJson 覆盖它..它只会污染内存......调试你的代码并检查返回值getType 的
-
最好使用私有列表 readPlayer() {.. return list;} 。它也可以在课外重复使用。
-
@SumeshTG 这里的问题不是设计;)我想他只是想知道为什么他有空指针,设计来了:D
标签: java json arraylist constructor