【问题标题】:java file readline returns nulljava文件readline返回null
【发布时间】:2013-08-19 16:08:33
【问题描述】:

我正在尝试用 Java 创建一个预订系统,但是每次我运行程序时,while 循环(如下所示)都会直接跳到最后,就好像读取的行是空的一样

   //hardcoded file path - needs to be changed when program moved
            String fileName = "C:\\Users\\BOO\\Desktop\\SystemsSoftwareBookingsystem\\FilmData.txt";
            String line = null;
            int readInt = 0;
            float readFloat = 0;
            int item_counter = 0;

    try
            {

             BufferedReader bufferedReaderF = new BufferedReader(new FileReader(new File(fileName)));  

 while ((line = bufferedReaderF.readLine()) != null)
            {
                Film tmpFilm = new Film();

                switch (item_counter)
                {
                    case 0:
                {
                    line = bufferedReaderF.readLine();
                    tmpFilm.name = line;
                    item_counter++;
                    break;
                }
                case 1:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.seatsTotal = readInt;
                    item_counter++;
                    break;
                }
                case 2:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.seatsAvailable = readInt;
                    item_counter++;
                    break;
                }
                case 3:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.price = readFloat;
                    item_counter++;
                    break;
                }
                case 4:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.showingTime = readFloat;
                    item_counter++;
                    break;
                }
                case 5:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.day = readInt;
                    item_counter++;
                    break;
                }
                case 6:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.month = readInt;
                    item_counter++;
                    break;
                }
                case 7:
                {
                    readInt = bufferedReaderF.read();
                    tmpFilm.year = readInt;
                    item_counter = 0;
                    break;
                }
                }

                line = bufferedReaderF.readLine();

                server.filmList.add(tmpFilm);

            }

            bufferedReaderF.close();

        } catch (FileNotFoundException ex)
        {
            System.out.println("Unable to open file '" + fileName + "'");
        } catch (IOException ex)
        {
            System.out.println("Error reading file '" + fileName + "'");
        }
    }
}`

任何想法/帮助将不胜感激

EDIT 根据要求在 while 循环中添加了其余代码

编辑这里是我正在读取的文件

Film 1
10
10
5.00
10.30
Wednesday 23rd
July
2013

【问题讨论】:

  • 你确定文件不是空的吗?

标签: java null readline filereader


【解决方案1】:

我不知道这是否与问题有关,但是您需要在switch 中的每个代码序列之后放置break; 语句。否则,如果说item_counter为0,它将执行0的代码,然后遍历并执行1的代码,然后执行2的代码,等等。

【讨论】:

  • 感谢您指出这一点 - 我现在已经解决了这个问题,但这不是导致问题的原因
【解决方案2】:

删除-

line = bufferedReaderF.readLine();

并在循环中读取-

while ((line = bufferedReaderF.readLine()) != null)

检查文件是否为空。您还可以在 while 中使用代码更新您的问题吗?

根据您的编辑-

您正在忽略您正在阅读的内容。应该是这样的-

switch (item_counter)
{
    case 0:
    {
        tmpFilm.name = line;
        item_counter++;
        break;
    }
    case 1:
    {                    
        tmpFilm.seatsTotal = Integer.parseInt(line);
        item_counter++;
        break;
    }
    ...etc...

【讨论】:

  • 那个底线不编译,必须是while((line = bufferedReaderF.readLine()) != null){ ..... }
  • @JimGarrison - 他的变量名是“bufferedReaderF”。
  • 我已经恢复了编辑;但是,这个答案似乎并没有解决实际问题。建议的编辑,如果不加上删除额外的读取在循环结束将导致替代输入行被跳过。
  • 我已尝试进行这些更改,但不幸的是由于某种原因它仍然无法正常工作
  • @JimGarrison - 在进行有问题的编辑之前给出了答案......由于我在回答中要求的内容,也进行了有问题的编辑..
【解决方案3】:

试试这个...

BufferedReader bufferedReaderF = new BufferedReader(new FileReader(new File(fileName)));  
line = bufferedReaderF.readLine();
 while (line != null)
                {
                    Film tmpFilm = new Film();

                    switch (item_counter)
                    {
                        case 0:
                        {
                           // line = bufferedReaderF.readLine();
                            tmpFilm.name = line;
                            item_counter++;
                            break;
                        }
                        case 1:
                        {
                            readInt=Integer.parseInt(line);
                            tmpFilm.seatsTotal = readInt;
                            item_counter++;
                            break;
                        }
                        case 2:
                        {
                            readInt = Integer.parseInt(line);
                            tmpFilm.seatsAvailable = readInt;
                            item_counter++;
                            break;
                        }
                        case 3:
                        {
                            readFloat=Float.parseFloat(line);
                            tmpFilm.price = readFloat;
                            item_counter++;
                            break;
                        }
                        case 4:
                        {
                            readFloat=Float.parseFloat(line);
                            tmpFilm.showingTime = readFloat;
                            item_counter++;
                            break;
                        }
                        case 5:
                        {
                            line=line.replaceAll("\\D","");
                            readInt = Integer.parseInt(line);
                            tmpFilm.day = readInt;
                            item_counter++;
                            break;
                        }
                        case 6:
                        {
                            readInt = Integer.parseInt(GregorianCalendar.class.getField(line.toUpperCase()).get(line))+1;
                            tmpFilm.month = readInt;
                            item_counter++;
                            break;
                        }
                        case 7:
                        {
                            readInt = Integer.parseInt(line);
                            tmpFilm.year = readInt;
                            item_counter = 0;                   
                        }
                    }

                    line = bufferedReaderF.readLine();

                    server.filmList.add(tmpFilm);

                }

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 2016-01-03
    • 2020-11-29
    • 2014-09-26
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多