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

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 に答える