使用一行和多个变量读取文本文件时遇到问题

时间:2013-10-22 12:40:42

标签: java exception text indexoutofboundsexception filewriter

(已修复)我是Java的新手(您可能会通过代码的低效率来判断)并且我在从文本文件中读取数据时遇到问题。

以下是我如何创建文件并将数据写入文件的示例。

  final String GString = "c:/GradeCalc/java/files";
        Path Gpath = Paths.get(GString);
        if (Files.notExists( Gpath )){
            try {
                Files.createDirectories(Gpath);
            } catch (IOException e2) {

                System.out.println(e2);
            }
        }

        final String Gfile = "Grades.txt";
         Path filePath = Paths.get(GString, Gfile);
         if (Files.notExists (filePath)) {

            try {
                Files.createFile (filePath);
            } catch (IOException e1) {

                System.out.println(e1);
            }
        }

        File gradeFile = filePath.toFile();
        try (PrintWriter out = new PrintWriter(
                new BufferedWriter(
                new FileWriter (gradeFile))))
        {

            if (BQ1Num != null){
            out.print(BQ1Num + "\t" );
            }else{
                out.print("0.0"+"\t");}
            if (BQ2Num != null){
                out.print(BQ2Num + "\t" );
                }else{
                    out.print("0.0"+"\t");}
            if (BQ3Num != null){
                out.print(BQ3Num + "\t" );
                }else{
                    out.print("0.0"+"\t");}
            if (BQ4Num != null){
                out.println(BQ4Num + "\t" );
                }else{
                    out.println("0.0"+"\t");}

                out.close ();
        }
            catch (IOException a)
            {
                System.out.println (a);
                }

将数据写入文件似乎完美无缺。当我尝试读取数据并将其设置为变量时,我的问题就出现了。

以下是我如何尝试从所述文件读取数据并将数据分配给变量,然后使用这些变量的示例。

            try (BufferedReader in = new BufferedReader(new FileReader(Gfile))){

                String line = in.readLine();

                while(line != null){
                String[] columns = line.split("\t");
                BQ1RetrievedNum = columns [0];
                BQ2RetrievedNum = columns [1];
                BQ3RetrievedNum = columns [2];
                BQ4RetrievedNum = columns [3];

                 line = in.readLine();
                }
                }

            catch(IOException b){

                System.out.println(b);

            }




    if (BQ1RetrievedNum != null ){
    BQ1.setText("   Quarter 1  " +BQ1RetrievedNum+ "%");
    }
    if (BQ2RetrievedNum != null){
    BQ2.setText("   Quarter 2  " +BQ2RetrievedNum+ "%");
    }
    if (BQ3RetrievedNum != null){
    BQ3.setText("   Quarter 3  " +BQ1RetrievedNum+ "%");
    }
    if (BQ4RetrievedNum != null){
    BQ4.setText("   Quarter 4  " +BQ1RetrievedNum+ "%");
    }

每当我运行程序时,我都会得到ArrayIndexOutOfBoundsException。 我一直在寻找如何解决这个异常的几个小时,但没有成功。

以下是Grades.txt的内容。

43.0 0.0 0.0 0.0

以下是我在编辑后现在拥有的fileReader的代码。

try (BufferedReader in = new BufferedReader(new FileReader(Gfile))){

                String line = in.readLine();
                line = in.readLine();
                  String[]columns = line.split("\t");
                  for(int i=0;i<4;i++) {
                       if(i<columns.length) {
                          switch(i) {
                             case 1:  BQ1RetrievedNum = columns[0];
                                      break;
                             case 2:  BQ2RetrievedNum = columns[1];
                                      break;
                             case 3:  BQ3RetrievedNum = columns[2];
                                    break;
                             case 4:  BQ4RetrievedNum = columns [3];
                                    break;


                       }
                  }
                }
            }


            catch(IOException b){

                System.out.println(b);

            }

我在这一行上不断获得NullPointerException

 String[]columns = line.split("\t");

这是我修复过的阅读器的代码。

 try (BufferedReader reader = Files.newBufferedReader(filePath, ENCODING )){
                  String line = null;
                  while ((line = reader.readLine()) != null) {

                System.out.println(line);
                String[]columns = line.split("/");
                BQ1RetrievedNum = "";
                BQ2RetrievedNum = "";
                BQ3RetrievedNum = "";
                BQ4RetrievedNum = "";

                System.out.println(columns.length);

                for(int i=0;i<4;i++) {
                    if(i<columns.length) {
                       switch(i) {
                          case 0:  BQ1RetrievedNum = columns[0];
                                   break;
                          case 1:  BQ2RetrievedNum = columns[1];
                                   break;
                          case 2:  BQ3RetrievedNum = columns[2];
                                 break;
                          case 3:  BQ4RetrievedNum = columns[3];
                                 break;


                       }
                    }
                }

                System.out.println("1: "+BQ1RetrievedNum);
                System.out.println("2: "+BQ2RetrievedNum);
                System.out.println("3: "+BQ3RetrievedNum);
                System.out.println("4: "+BQ4RetrievedNum);

                  }
                }



            catch(IOException b){

                System.out.println(b);

            }

2 个答案:

答案 0 :(得分:3)

根据\t split

String[] columns = line.split("\t");

您不检查返回数组的长度。你在其中一行中获得了exception

BQ1RetrievedNum = columns [0];
BQ2RetrievedNum = columns [1];
BQ3RetrievedNum = columns [2];
BQ4RetrievedNum = columns [3];

在此之前,请确保该数组有4个元素。


您可以这样做:

for(int i=0;i<4;i++) {
   if(i<columns.length) {
      switch(i) {
         case 1:  BQ1RetrievedNum = columns[0];
                  break;
         case 2:  BQ2RetrievedNum = columns[1];
                  break;
         //...
      }
   }
}

答案 1 :(得分:1)

查看数组的长度

System.out.println(columns.length);

它可能不包含预期的值数

编辑:以下代码为我工作。案例值已编辑。

String line = "43.0 0.0 0.0 0.0";
    String[]columns = line.split("\t");
    String output1 = "";
    String output2 = "";
    String output3 = "";
    String output4 = "";

    System.out.println(columns.length);

    for(int i=0;i<4;i++) {
        if(i<columns.length) {
           switch(i) {
              case 0:  output1 = columns[0];
                       break;
              case 1:  output2 = columns[1];
                       break;
              case 2:  output3 = columns[2];
                     break;
              case 3:  output4 = columns[3];
                     break;
           }
        }
    }

    System.out.println("1: "+output1);
    System.out.println("2: "+output2);
    System.out.println("3: "+output3);
    System.out.println("4: "+output4);

String.split("")不会抛出NullPointerException