这是我在大学工作的一个项目,除了初始化游戏的游戏课外,一切似乎都很好。这是一个片段
public class Game{
private Player player;
private World world;
private ArrayList<NonPlayableFighter> weakFoes;
private ArrayList<NonPlayableFighter> strongFoes;
private ArrayList<Attack> attacks;
private ArrayList<Dragon> dragons;
public Game() throws IOException{
player = new Player("");
world = new World();
weakFoes = new ArrayList<NonPlayableFighter>();
strongFoes = new ArrayList<NonPlayableFighter>();
attacks = new ArrayList<Attack>();
dragons = new ArrayList<Dragon>();
loadAttacks ("Database-Attacks_20309.csv");
loadFoes ("Database-Foes_20311.csv");
loadDragons ("Database-Dragons_20310.csv");
}
之后是一些吸气剂和我应该实施的4方法。
这些方法是loadCSV(String filePath)
,loadAttacks(String filePath)
,loadFoes(String filePath)
,loadDragons(String filePath)
我创建了loadCSV(String filePath)
,使得它返回String []的ArrayList:
private ArrayList<String[]> loadCSV(String filePath) throws IOException{
String currentLine = "";
ArrayList<String[]> result = new ArrayList<String[]>();
FileReader fileReader = new FileReader(filePath);
BufferedReader br = new BufferedReader(fileReader);
currentLine = br.readLine();
while (currentLine != null){
String[] split = currentLine.split(",");
result.add(split);
}
br.close();
return result;
}
然后我想加载一些攻击,敌人和龙,并将它们插入相应的ArrayList中
我在这里申请了loadAttacks(String filePath)
:
private void loadAttacks(String filePath) throws IOException{
ArrayList<String[]> allAttacks = loadCSV(filePath);
for(int i = 0; i < allAttacks.size(); i++){
String[] current = allAttacks.get(i);
Attack temp = null;
switch(current[0]){
case "SA": temp = new SuperAttack(current[1],
Integer.parseInt(current[2]));
break;
case "UA": temp = new UltimateAttack(current[1],
Integer.parseInt(current[2]));
break;
case "MC": temp = new MaximumCharge();
break;
case "SS": temp = new SuperSaiyan();
break;
}
attacks.add(temp);
}
}
我写了它,它从loadCSV(String filePath)
返回ArrayList,并使用一个开关搜索第一个String上的ArrayList中的每个String [],从而创建适当的攻击并将其添加到攻击中。
然后我想为Foes读取另一个CSV,并且CSV文件的结构使得在第一行有一些属性,第二行有些类型的SuperAttack攻击,第三行有一些类型的Ultimate攻击攻击。同样在每个敌人中都有一个布尔属性,用于确定它是强者还是弱者,从而将其置于正确的Arraylist中。以下是loadFoes(String filePath)
的代码:
private void loadFoes(String filePath) throws IOException{
ArrayList<String[]> allFoes = loadCSV(filePath);
for(int i = 0; i < allFoes.size(); i += 3){
String[] current = allFoes.get(i);
String[] supers = allFoes.get(i+1);
String[] ultimates = allFoes.get(i+2);
ArrayList<SuperAttack> superAttacks = new ArrayList<SuperAttack>();
ArrayList<UltimateAttack> ultimateAttacks = new ArrayList<UltimateAttack>();
NonPlayableFighter temp = null;
for(int j = 0; i < supers.length; j++){
int index = attacks.indexOf(supers[j]);
if(index != -1){
superAttacks.add((SuperAttack)attacks.get(index));
}
else break;
}
for(int j = 0; i < ultimates.length; j++){
int index = attacks.indexOf(ultimates[j]);
if(index != -1){
ultimateAttacks.add((UltimateAttack)attacks.get(index));
}
else break;
}
if(current[7].equalsIgnoreCase("True")){
temp = new NonPlayableFighter(current[0], Integer.parseInt(current[1]),
Integer.parseInt(current[2]), Integer.parseInt(current[3]),
Integer.parseInt(current[4]), Integer.parseInt(current[5]),
Integer.parseInt(current[6]), true, superAttacks, ultimateAttacks);
strongFoes.add(temp);
}
else{
temp = new NonPlayableFighter(current[0], Integer.parseInt(current[1]),
Integer.parseInt(current[2]), Integer.parseInt(current[3]),
Integer.parseInt(current[4]), Integer.parseInt(current[5]),
Integer.parseInt(current[6]), false, superAttacks, ultimateAttacks);
weakFoes.add(temp);
}
}
}
首先,我从loadCSV(String filePath
返回的ArrayList中获取前三个String []并进行2次循环以检查攻击是否在先前加载的攻击CSV中,然后我检查确定它是否为a的属性强或弱并相应地创建一个新的NonPlayableFighter
并将其添加到适当的列表中。
为此赋值运行jUnit4测试,它给出了一个编译错误:未处理的异常类型IOException。一般来说,代码是否有任何明显的问题?
答案 0 :(得分:0)
如果不是任务的一部分,最好重新使用已存在的Java文件阅读器(例如CVSReader)。
答案 1 :(得分:0)
这会产生很多代码。我将回答您的编译错误。
在阅读文件时,您必须在try catch中填写代码以避免此类错误。在loadCSV方法中,您必须设置一个try catch块。
有关完整教程,请参阅this site。
try (BufferedReader br = new BufferedReader(new FileReader("C:\\testing.txt")))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
String[] split = currentLine.split(",");
result.add(split);
}
} catch (IOException e) {
e.printStackTrace();
}
简而言之,访问文件的代码必须在try catch中以避免IO异常,或者在抛出异常的方法中(但必须在其他地方捕获)。
在该代码中,您有一个很好的资源尝试示例,非常好的方法来管理您的资源和内存。
答案 2 :(得分:0)
loadCSV(String filePath)是一个无限循环不是吗?至于IOException,它作为@RPresle建议使用try / catch来解决BufferedReader的问题。