有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

返回null的java数组

我试图读入一个csv文件,并将该行放入一个数组中。但是当我打印出数组时,它是空的

代码如下:

public static String[] readFile(String inFilename)
{
    int lineTotal = getLineNum(inFilename); 
    if (lineTotal == 0)
    {
        System.out.println("The file is empty ");
    }
    FileInputStream fileStrm = null;
    InputStreamReader rdr;
    BufferedReader bufRdr; 
    String[] resultArrayOne = new String[lineTotal + 1];
    String line;
    try 
    { 
        fileStrm = new FileInputStream(inFilename); //open file
        rdr = new InputStreamReader(fileStrm); //create a reader to read the stream
        bufRdr = new BufferedReader(rdr);//read file line by line 
        int lineNum;
        String[] resultArray = new String[lineTotal];
        String info;

        lineNum = 0;
        while ((line = bufRdr.readLine()) != null)  //While not end-of-file, process and read lines
        {
            info = line; 
            System.out.println(info);
            resultArray[lineNum] = info;
            lineNum++; 
        }
        fileStrm.close(); //Clean up the stream
        resultArrayOne = resultArray; 
    }
    catch (IOException e) // MUST catch IOExceptions
    {
        if (fileStrm != null)  //Clean up the stream if it was opened
        {
            try 
            { 
                fileStrm.close(); 
            } 
            catch (IOException ex2) { } // We can’t do anything more!
        }
        System.out.println("Error in file processing: " + e.getMessage()); //Or do a throw
    }
    return resultArrayOne;  
}

在将该行放入数组之前打印出该行时,返回值可以,但放入数组时返回值变为空

编辑:

以下是完整的FileIO代码:

public static String[] Import()
{
    Scanner sc = new Scanner(System.in);
    System.out.println("Please enter the File Name: ");
    String fileName = sc.nextLine();
    int length = getLineNum(fileName); 
    String[] array = new String[length+1];
    array = readFile(fileName); 
    return array; //array is just strings     
}

public static int getLineNum(String inFilename)
{
    FileInputStream fileStrm = null;
    InputStreamReader rdr;
    BufferedReader bufRdr; 
    String line;
    int lineNum = 0; 
    try 
    { 
        fileStrm = new FileInputStream(inFilename); //open file
        rdr = new InputStreamReader(fileStrm); //create a reader to read the stream
        bufRdr = new BufferedReader(rdr);//read file line by line 
        lineNum = 0;
        while ((line = bufRdr.readLine()) != null)  //While not end-of-file, process and read lines
        {
            lineNum++; 
        }
        fileStrm.close(); //Clean up the stream
    }
    catch (IOException e) // MUST catch IOExceptions
    {
        if (fileStrm != null)  //Clean up the stream if it was opened
        {
            try 
            { 
                fileStrm.close(); 
            } 
            catch (IOException ex2) { } // We can’t do anything more!
        }
        System.out.println("Error in file processing: " + e.getMessage()); //Or do a throw
    }
    return lineNum;  
} 

我不太确定如何插入示例文件,但它是这样的:

SHOP1, STORE2, 45
SHOP2, SHOP1, 67
STORE6, SHOP1, 90
...

编辑2:

我添加了使用这个的代码

String[] locationArrayOne = new String[1000];     
locationArrayOne = FileIO.Import();
                                    for (int yyy = 0; yyy < locationArrayOne.length; yyy++)
                                    {
                                        System.out.print(locationArray[yyy]);  
                                    }

共 (1) 个答案

  1. # 1 楼答案

    你的代码看起来不错,但我将如何调试这个问题:

    1. lineNum++之前,我将打印resultArray[lineNum]而不是info的值,以查看程序是否能够检索该行并将其存储到数组中
    2. 移除String[] resultArrayOne的初始化,在fileStrm.close()之后,使用resultArrayOne = resultArray.clone()resultArray的值复制到resultArrayOne。通过赋值(array1=array2)复制数组可能会产生程序中不希望出现的副作用,因为这两个数组都指向同一个对象Check this related question here

    另外,为什么不在存储行时直接使用resultArrayOne