if语句中的java.lang.ArrayIndexOutOfBoundsException错误
我发现了错误if语句中的java.lang.ArrayIndexOutOfBoundsException错误,java,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
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");
}
}
包分配;
导入java.io.FileReader;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
导入com.opencsv.CSVReader;
导入java.io.FileNotFoundException;
公共类助理1{
公共静态void main(字符串[]args)引发IOException
{
试一试{
CSVReader CSVReader=新的CSVReader(新的文件读取器(“E:/AviationData.txt”),“\t',“\n”);
PrintWriter NYreports=新的PrintWriter(“E:/NYreports.txt”);
字符串[]下一行;
int x;
整数和=0;
双倍总死亡率=0;
最大整数=0;
最小整数=0;
字符串[]标记=null;
//读取第一行,但它不会和其他记录一起计数
nextLine=csvReader.readNext();
//为飞行场中独特的宽相位创建地图
Map broadPhase=newhashmap();
//创建一个数组列表,该列表将接受致命伤害的整数值
ArrayList intList=新的ArrayList();
而((nextLine=csvReader.readNext())!=null){
sum++;
字符串字段=下一行[0];
//使用正则表达式值!
令牌=字段。拆分(\\s\\\\\s”);
//for(字符串s:标记){
//系统输出打印项次;
//}
if(标记[28]。等于(“”){
broadPhase.put(令牌[28],0);
}
如果(!token[28].equals(“”)&!token[28].equals(“”){
broadPhase.put(令牌[28],1);
}
//搜索致命伤害值
如果(!token[23].isEmpty()){
x=整数.parseInt(标记[23]);
//添加到ArrayList
添加(x);
totalFatal=x+totalFatal;
}
if(令牌[4]。包含(“,NY”)&令牌[5]。包含(“/2015”)){
NYreports.println(nextLine[0]);
}
}
对于(int i=0;i最大);
最大=intList.get(i);
if(intList.get(i)<最小值)
最小=intList.get(i);
}
System.out.println(“存在“+总和+”记录”);
System.out.println(“在飞行的宽相位中有”+(broadPhase.size())+“唯一值”);
totalFatal=(totalFatal/总和);
System.out.println(最大+“是最大的致命伤害数”);
System.out.println(“致命伤害的平均值为”+总致命性);
NYreports.close();
csvReader.close();
}
捕获(FileNotFoundException ex){
System.out.println(“未找到文件”);
}
}
}
错误在写入if(标记[28].equals(“”){.的行上。
我可以改变什么来避免它。如果我使用的方法可以改变的话
ArrayIndexOutOfBoundsException通常在尝试访问时发生
数组中不存在的索引
,即.index>length-1(因为java中的数组是基于0的)
要避免此错误,请确保只使用有效的索引,这些索引是
0=if(token.length > 28 && token[28].equals(" ")){
broadPhase.put(token[28],0);
}
该错误是因为
标记[28]
不存在。换句话说,您的split()
调用返回的数组的长度没有您认为的那么长。我会检查您的输入,看看您的输入是否正确
另一方面,您的方法似乎非常……粗糙且编码很硬。假设您知道令牌存储的确切顺序,那么避免ArrayIndexOutOfBounds异常的更好方法是使用for each循环或normal for循环遍历令牌数组
然后可以在循环遍历每个部分时对其进行解析
例如:
for (int i = 0; i < tokens.length; i++) {
// based on the i value, parse a different way
}
for(int i=0;i
这只是意味着标记数组中的第29个条目不存在。请记住,数组索引从0开始。在从数组中访问某个索引之前,请进行长度检查