Java 例外:ArrayIndexOutOfBounds

Java 例外:ArrayIndexOutOfBounds,java,Java,当我试图将数据从文件读入数组时,会出现数组索引越界异常。该文件有700行数据,类似于: 血管炎血浆交换“,”FCE883“,”http://ncbi.nlm.nih.gov/pubmed/18646089“,”(252232 131)” “血管炎-强的松”,“C5E384”http://ncbi.nlm.nih.gov/pubmed/19588365“,”(197227132)” 我的代码是: static{ COLOR_CODES = new ArrayList<String

当我试图将数据从文件读入数组时,会出现
数组索引越界异常。该文件有700行数据,类似于:

血管炎血浆交换“,”FCE883“,”http://ncbi.nlm.nih.gov/pubmed/18646089“,”(252232 131)”

“血管炎-强的松”,“C5E384”http://ncbi.nlm.nih.gov/pubmed/19588365“,”(197227132)”

我的代码是:

static{  
    COLOR_CODES = new ArrayList<String[]>();

    try{ 
        FileReader fr = new FileReader("Crayon.properties");
        BufferedReader br = new BufferedReader(fr);
        String line;

        while ( (line = br.readLine()) != null) {       

            COLOR_CODES.add(new String[]{line});               
        } 
        br.close();
        fr.close();

    }catch (Exception e){
        throw new IllegalStateException("Couldn't load array file");
    }       
}

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException,
        IOException
{
    JSONArray fullColorArray;
    String query = request.getParameter("q");

    try {
        int count = 0;
        if (query.equals(m_lastQuery)) {
            fullColorArray = m_lastResults;
            count = m_lastResults.length();
        } else {
            m_lastQuery = query;

            fullColorArray = new JSONArray();
            for (String[] colorCode : COLOR_CODES) {
                String colorName = colorCode[0];
                String lowerColor = colorName.toLowerCase();
                int has = lowerColor.indexOf(query.toLowerCase());

                if (!query.isEmpty() && (query.equals("*") || has >= 0)) {
                    JSONObject color = new JSONObject();
                    color.put("DisplayName", colorName);
                    color.put("Value", colorCode[1]); // <-------- ArrayIndexOutOfBoundsException
                    color.put("Description", colorCode[2]);
                    color.put("RGB", colorCode[3]);
                    fullColorArray.put(color);
                    count++;
                }
            }
            m_lastResults = fullColorArray;
        } 
static{
COLOR_CODES=new ArrayList();
试试{
FileReader fr=新的FileReader(“Crayon.properties”);
BufferedReader br=新的BufferedReader(fr);
弦线;
而((line=br.readLine())!=null){
添加(新字符串[]{line});
} 
br.close();
fr.close();
}捕获(例外e){
抛出新的IllegalStateException(“无法加载数组文件”);
}       
}
@凌驾
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException,
IOException
{
JSONArray全彩色阵列;
字符串查询=request.getParameter(“q”);
试一试{
整数计数=0;
if(query.equals(m_lastQuery)){
fullColorArray=m_lastResults;
count=m_lastResults.length();
}否则{
m_lastQuery=查询;
fullColorArray=new JSONArray();
for(字符串[]颜色代码:颜色代码){
字符串colorName=colorCode[0];
字符串lowerColor=colorName.toLowerCase();
int has=lowerColor.indexOf(query.toLowerCase());
如果(!query.isEmpty()&&(query.equals(“*”)| | has>=0)){
JSONObject color=新的JSONObject();
color.put(“DisplayName”,colorName);

color.put(“Value”,colorCode[1]);//您没有指定ArrayIndexOutOfBounds异常发生的位置-我假设该位置不在上述代码中

为什么要构造数组的ArrayList?您是否知道

COLOR_CODES.add(new String[]{line});
将数组添加到ArrayList;数组本身包含一个元素,即刚刚读取的行

是不是你想做类似的事情

COLOR_CODES.add(line.split('insert_your_split_regex_here'));

我想你想要的是:

 while ( (line = br.readLine()) != null)        
      COLOR_CODES.add(line.split(","));               

我认为该代码不可能给出该异常

  • 该代码中使用的任何方法或基元操作都不会引发该异常
  • 如果他们(假设)这样做了,那么
    catch
    会将其转换为另一个异常,并且在堆栈跟踪(如果有的话)中不会看到原始异常的任何跟踪
我想你会发现它被抛出到其他代码中。除非包含其他代码和stacktrace,否则我认为我们无法帮助你。(更好的是,提供一个…以便我们可以重现错误。)

    -
根据您的分隔符将行拆分为
字符串[]

您应该在问题中添加stacktrace消息,并解释您希望从该代码中得到什么,因为将整行保存到
新字符串[]{line}
have no reason.java.lang.ArrayIndexOutOfBoundsException:1位于org.spiffyui.spiffynavigation.server.CrayonColorsServlet.doGet(CrayonColorsServlet.java:103)color.put(“Value”,colorCode[1]);我使用MVsb示例()(集成到“导航”示例)自动完成数据显示。A.类路径具有“src/main/resources”保存数据文件的位置。此错误同时发生在cmd和eclipse上。是的,但ArrayIndexOutOfBounds异常不可能是这种情况。它给出了NullPointerException?我应该使用,在拆分行的位置添加一些日志记录以检查结果。如果正确拆分并在数组中设置字符串,则应work@user2339074-发布NullPointerException您拥有的NullPointerException位于“count=m_lastResults.length();”请注意颜色代码.add(新字符串[]{“Vasculatis_PlasmaExchange”、“#FCE883”、”、“,”(252,232,131)“});颜色代码。添加(新字符串[]{“血管炎强的松”,“C5E384”,“197227132)”);工作完美。通过数组数组,可以方便地访问自动完成建议框中的多个值。此外,按“\”拆分,“将给出错误。在您的行
字符串[]somearray=someline.split(\\”,)之后;
,添加一个类似于
的检查,如果(somearray.length!=4){System.err.println(“错误分析行”+someline+”,数组是:“+Arrays.toString(somearray));}
二者”,“和”\”,"在访问数组时拆分为NullPointerException。示例位于:。第65行在第90行生成NullPointerException&&ArrayIndexOutOfBoundsException,位于101。请注意,我将数据从crayoncolorservlet.java传输到crayon.properties文件。该文件位于类路径中的src\main\resources。因此,我假设阵列可以访问该文件。如果我从未看到catch异常,它是否保证我的文件确实已被读取?1)A无法确定您实际引用的是哪个文件。2)不一定。在某些情况下,不会报告未捕获的异常。我得到的NullPointerException似乎是因为Crayon.properties文件在最外层文件夹时是只读的,而不是在其类路径时。
 while ( (line = br.readLine()) != null)        
      COLOR_CODES.add(line.split(","));