if语句中的java.lang.ArrayIndexOutOfBoundsException错误

时间:2015-09-12 04:00:11

标签: java

我收到错误

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 28
    at assignment.assgn1.main(assgn1.java:44)

如果有人能指出错误

,我将非常感激
    package assignment;

    import java.io.FileReader;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;

    import com.opencsv.CSVReader;
    import java.io.FileNotFoundException;

public class assgn1 {

public static void main(String[] args) throws IOException
{
    try{

        CSVReader csvReader = new CSVReader(new FileReader("E:/AviationData.txt"),'\t','\n');
        PrintWriter NYreports = new PrintWriter("E:/NYReports.txt");
        String [] nextLine;
        int x;
        int sum=0;
        double totalFatal=0;
        Integer largest = 0;
        Integer smallest = 0;
        String [] token = null;
        //read first line, but it will not be counted with the rest of the records
        nextLine = csvReader.readNext();
        //create a map for unique Broad Phase in flight fields
        Map<String, Integer> broadPhase = new HashMap <String, Integer>();
        //create an array list that will take in integer values of Fatal Injuries
        ArrayList <Integer> intList = new ArrayList<Integer>();
        while ((nextLine = csvReader.readNext()) !=null){
            sum++;

            String field = nextLine[0];
            //using regex values!
            token = field.split("\\s\\|\\s");
//for (String s: token){
//System.out.println(s);
//}
 if(token[28].equals(" ")){
broadPhase.put(token[28],0);
 }
  if(!token[28].equals(" ") && !token[28].equals("")){
broadPhase.put(token[28], 1);
 }

   //search for Fatal Injury values
   if(!token[23].isEmpty()){

  x=Integer.parseInt(token[23]);
  //add to ArrayList
   intList.add(x);
   totalFatal = x + totalFatal;
   }

    if(token[4].contains(", NY") && token[5].contains("/2015")){

 NYreports.println(nextLine[0]);


    }

        }

                for(int i =0; i<intList.size()-1; i++){
                if (intList.get(i) > largest);
                largest = intList.get(i);
                 if (intList.get(i)< smallest)
                smallest = intList.get(i);
                }

                System.out.println("There are " + sum + " records");

                System.out.println("There are " + (broadPhase.size())+" unique values in Broad Phase of Flight");
                 totalFatal = (totalFatal/sum);
                 System.out.println(largest + " is the largest number of Fatal injuries");
                 System.out.println("The average of Fatal injuries is " + totalFatal);
            NYreports.close();
            csvReader.close();
    }
    catch (FileNotFoundException ex){
        System.out.println("File not Found");
    }
}

}

错误出现在if(token [28] .equals(“”)){。是写的。 有什么可以改变以避免它。如果我使用的方法有任何改变,也可以。

2 个答案:

答案 0 :(得分:0)

  

当您尝试访问时,通常会发生ArrayIndexOutOfBoundsException   数组中不存在的索引

,即...索引&gt; length - 1(因为java中的数组基于0)。

要避免此错误,请确保仅使用有效索引

  

0 =&lt; idx&lt;长度。

在当前上下文中,您可能需要添加一个额外的检查以确保该数组包含该索引以及正常的if条件。

类似

if(token.length > 28 && token[28].equals(" ")){
   broadPhase.put(token[28],0);
 }

答案 1 :(得分:0)

错误是因为token[28]不存在。换句话说,您的split()调用返回的数组不像您想象的那么长。我会检查你的输入,看看你的输入是否正确。

另一方面,您的方法似乎非常粗糙且硬编码。假设您知道令牌存储的确切顺序,那么避免ArrayIndexOutOfBounds Exception的更好方法是使用a for a循环或for normal for循环来遍历你的tokens数组。

然后,您可以在循环浏览每个部分时解析它。

例如:

for (int i = 0; i < tokens.length; i++) {
    // based on the i value, parse a different way
}