0

(已修复)我是 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);

            }
4

2 回答 2

3

当您根据以下方式拆分\t时:

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

您不检查返回数组的长度。您在以下行之一中遇到异常:

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;
         //...
      }
   }
}
于 2013-10-22T12:44:19.610 回答
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

于 2013-10-22T12:47:27.410 回答