2016-02-29 190 views
0

这是我在大学里开展的一个项目,除了初始化游戏的游戏课程之外,一切似乎都很好。这里是一个片段从csv文件中读取

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"); 
} 

之后,后面跟着一些getters和我应该实现的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); 
    } 
} 

我写,使得它需要该ArrayList使用开关从而创建适当的攻击并添加从loadCSV(String filePath)和搜索返回在每个String []在第一字符串ArrayList的内它来攻击。
然后我想为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); 
     } 
    } 
} 

首先我拿到前三的String [] ArrayList中从loadCSV(String filePath返回并取得2个循环检查,如果攻击是以前加载攻击中CSV然后我检查了属性,确定它是强还是弱,并相应地创建一个新的NonPlayableFighter并将其添加到适当的列表中。

运行这个赋值的jUnit4测试,它给了我一个编译错误:未处理的异常类型IOException。一般来说,代码有什么显着的问题?

+0

你是否在Main Class或main()中处理异常(使用try/catch或throws)? – Mahendra

+0

进入loadCSV()方法,加入currentLine = br.readLine();进入while循环。 –

回答

0

如果不是您任务的一部分,最好重新使用已存在的Java文件CSV文件读取器(例如CVSReader)。

+0

这是一个创建loadCSV方法的任务 – alimoenes

+0

@alimoenes我看到......在这种情况下,我宁愿将'BufferedReader'作为您的'loacCSV'方法的参数。它将使您的方法更具普遍性:您可以从任何来源(文件,内存,网络...)读取CSV数据。此外,您必须在读取数据循环内添加另一个'readLine'调用,以读取第一个CSV行。 –

+0

我无法理解关于bufferedreader的部分。我会尝试把readline放在循环中并给你反馈。谢谢 – alimoenes

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异常,或者是抛出异常(但那么它在其他地方钓到)的方法。

在这段代码中,你有一个很好的例子,试用资源,非常好的方法来管理你的资源和内存。

+0

谢谢,我们还没有使用异常,而这个里程碑的目的是在不使用try,catch,throw等的情况下工作,我们给出了一个关于如何构建csv读取器的例子,并且我们应该确定返回类型并调整它。 – alimoenes

+0

这种考虑不适用于语言^^一切都可用于语言。但是你想避免使用try-catch(我建议你试试看:p),你必须确定你的main方法有'throws IOException'。堆栈中的每个方法都应该让异常继续。 – RPresle

0

loadCSV(String filePath)是一个无限循环不是吗?至于IOException,它作为@RPresle建议try/catch会绕过BufferedReader。

+0

是的,我认为如此;-) – Rainer