【发布时间】:2016-02-29 15:47:25
【问题描述】:
这是我在大学时正在做的一个项目,除了初始化游戏的游戏类之外,一切似乎都很好。这是一个sn-p
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");
}
之后是一些 getter 和我应该实现的 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[] 中搜索,从而创建适当的攻击并将其添加到攻击中。
然后我想为敌人读取另一个 CSV,并且 CSV 文件的结构使得第一行有一些属性,第二行有一些超级攻击类型的攻击,第三行有一些终极攻击类型的攻击。同样在每个敌人中都有一个布尔属性,用于确定它是强敌人还是弱敌人,从而将其放入正确的 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 中,然后我检查确定它是强还是强的属性弱并相应地创建一个新的NonPlayableFighter 并将其添加到适当的列表中。
为这个作业运行 jUnit4 测试它给了我一个编译错误:未处理的异常类型 IOException。一般来说,代码有什么明显的问题吗?
【问题讨论】:
-
您是否在主类或 main() 中处理了异常(使用 try/catch 或 throws)?
-
进入 loadCSV() 方法,添加 currentLine = br.readLine();也进入while循环。