数组索引超出界限异常问题

时间:2015-03-18 21:13:14

标签: java

我目前在我的阵列中收到一个出界问题,我真的不确定我在哪里出错了。我真的在寻找第二双眼睛,因为我会失去理智。

老实说,我很欣赏任何帮助。 不,真的:谢谢。

package com.jpmorgan.spring.csv;

import java.io.BufferedReader;  
import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.IOException;

public class CSVRead {  
    static void read() throws IOException { 
        String csvFileToRead = "profit.csv";  
        BufferedReader br = null;  
        String line = "";  
        String splitBy = ",";  

        try {  
            br = new BufferedReader(new FileReader(csvFileToRead));  

            while ((line = br.readLine()) != null) { 
                String[] array = line.split(splitBy);  
                System.out.println("Equity & Bonds: [Instrument Type= " + array[0] + " , Name="  + array[1] + " , Quantity=" + array[2] 
                                + " , Buy=" + array[3] + " , Sell=" + array[4] +  /*" , Coupon=" + array[5] +*/ "]");
            }

        } 
        catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }
        catch (IOException e) {  
            e.printStackTrace();  
        }
        finally {  
            if (br != null) {  
                try {  
                    br.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }
            } 
        }
        System.out.println("Done reading CSV file");
    }
}

这是完整的CSV文件。 我尝试过使用调试但是没有多大帮助。

instrument_type,name,quantity,buy_price,sell_price,coupon
Equity,AAA,123,1.01,1.10
Equity,BBBB,3,1.05,1.01
Bond,CCC,3,,,0.13
Equity,AAA,12,1.11,1.13
Bond,DD,3,,,1.24

主要课程供参考。

/**
 * Main class is menu driven, receives CSV input.
 * This program reads, calculates and writes CSV files.
 * @author David McNeill
 * @version 1.0 - 17/03/1015
 */

package com.jpmorgan.spring.csv;
import java.util.Scanner;   
public class CSVMain{

    public static void main(String[] arg) throws Exception {
        @SuppressWarnings("resource")
        Scanner in = new Scanner(System.in);
        int userChoice;
        boolean quit = false;
        do {
        System.out.println("Please choose an option using 1 - 4");                      //print text to screen
        System.out.println("------------------------------------");                     //print text to screen
        System.out.println("1: Read 'input' CSV file");                                 //print text to screen
        System.out.println("2: Calculate 'input' CSV file");                            //print text to screen
        System.out.println("3: Write calculation result to CSV file");                  //print text to screen
        System.out.println("4: Exit program");                                          //print text to screen
            userChoice = in.nextInt();                                                  //'in' equals integer
            if (userChoice == 4)                                                        //when '3' is input then...
                  quit = true;                                                          //the program will now quit
            else if (userChoice == 1)                                                   //when '1' is input then...
                    CSVRead.read();
            else if (userChoice == 2);
                //####################calculations go here#########################             
                //####################calculations go here#########################
                //####################calculations go here#########################
            else if (userChoice == 3)
                    CSVWrite.write();
        } while (!quit);
    }
}

2 个答案:

答案 0 :(得分:0)

分割线后,您应确保获得正确数量的列。

我无法告诉您如何修复潜在的错误数据,但我可以帮助您识别它。只需用以下内容替换内部循环:

int lineNum = 0;
while ((line = br.readLine()) != null) { 
    String[] array = line.split(splitBy);
    if (array.length < 5)
        throw new Exception("There's a problem with " + csvFileToRead + " on line " + lineNum + ":\n" + line);          
    System.out.println("Equity & Bonds: [Instrument Type= " + array[0] + " , Name="  + array[1] + " , Quantity=" + array[2] 
                            + " , Buy=" + array[3] + " , Sell=" + array[4] +  /*" , Coupon=" + array[5] +*/ "]");
    lineNum++;
}

答案 1 :(得分:0)

您的CSVRead没有主要方法..将呼叫更改为CSVRead.read();

import java.util.Scanner;   
public class CSVMain{

    public static void main(String[] arg) throws Exception {
        @SuppressWarnings("resource")
        Scanner in = new Scanner(System.in);
        int userChoice;
        boolean quit = false;
        do {
        System.out.println("Please choose an option using 1 - 4");                      //print text to screen
        System.out.println("------------------------------------");                     //print text to screen
        System.out.println("1: Read 'input' CSV file");                                 //print text to screen
        System.out.println("2: Calculate 'input' CSV file");                            //print text to screen
        System.out.println("3: Write calculation result to CSV file");                  //print text to screen
        System.out.println("4: Exit program");                                          //print text to screen
            userChoice = in.nextInt();                                                  //'in' equals integer
            if (userChoice == 4)                                                        //when '3' is input then...
                  quit = true;                                                          //the program will now quit
            else if (userChoice == 1)                                                   //when '1' is input then...
                    CSVRead.read();
            else if (userChoice == 2);
                //####################calculations go here#########################             
                //####################calculations go here#########################
                //####################calculations go here#########################
        } while (!quit);
    }
}

CSVRead.java

import java.io.BufferedReader;  
import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.IOException;

public class CSVRead {  
    static void read() throws IOException { 
        String csvFileToRead = "profit.csv";  
        BufferedReader br = null;  
        String line = "";  
        String splitBy = ",";  

        try {  
            br = new BufferedReader(new FileReader(csvFileToRead));  

            while ((line = br.readLine()) != null) { 
                String[] array = line.split(splitBy);  
                System.out.println("Equity & Bonds: [Instrument Type= " + array[0] + " , Name="  + array[1] + " , Quantity=" + array[2] 
                                + " , Buy=" + array[3] + " , Sell=" + array[4] +  /*" , Coupon=" + array[5] +*/ "]");
            }

        } 
        catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }
        catch (IOException e) {  
            e.printStackTrace();  
        }
        finally {  
            if (br != null) {  
                try {  
                    br.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }
            } 
        }
        System.out.println("Done reading CSV file");
    }
}

输出

Please choose an option using 1 - 4
------------------------------------
1: Read 'input' CSV file
2: Calculate 'input' CSV file
3: Write calculation result to CSV file
4: Exit program
1
Equity & Bonds: [Instrument Type= instrument_type , Name=name , Quantity=quantity , Buy=buy_price , Sell=sell_price]
Equity & Bonds: [Instrument Type= Equity , Name=AAA , Quantity=123 , Buy=1.01 , Sell=1.10]
Equity & Bonds: [Instrument Type= Equity , Name=BBBB , Quantity=3 , Buy=1.05 , Sell=1.01]
Equity & Bonds: [Instrument Type= Bond , Name=CCC , Quantity=3 , Buy= , Sell=]
Equity & Bonds: [Instrument Type= Equity , Name=AAA , Quantity=12 , Buy=1.11 , Sell=1.13]
Equity & Bonds: [Instrument Type= Bond , Name=DD , Quantity=3 , Buy= , Sell=]
Done reading CSV file

替代方案,将read方法重命名为main中的CSVRead

class public class CSVRead {  
    static void main() throws IOException { 

然后像CSVRead.main();

中的CSVMain一样调用它