2013-10-22 64 views
0

(已修復)我是Java的新手(您可能會通過代碼的低效性得出結論),並且在從文本中讀取數據時遇到問題文件。使用一行和多個變量讀取txt文件時遇到問題

以下是我如何創建文件並將數據寫入文件的示例。

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); 

      } 
+0

是什麼'ArrayIndexOutOfBoundsException'意味着什麼?什麼'String []列= line.split(「\ t」);'做? –

+0

從錯誤中顯而易見,列數組沒有您期望的元素。你可以嘗試使用Arrays.toString(列)打印列數組; –

回答

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

+0

我按照你的建議做了,我的數組只有一個元素。我現在試圖找出如何解決這個問題。 – JavaCodeBuilder

+0

謝謝,這解決了我的許多問題。現在我還有其他一些問題需要解決。 in.readLine中的方法是將文件內容作爲我的一個變量Num而不是實際的行讀取。 – JavaCodeBuilder

+0

'in.readLine'不會將Grade.txt的內容讀取爲「43.0/0.0/0.0/0.0 /」。其他一切都很完美。你知道什麼可能是錯的嗎? – JavaCodeBuilder

3

當你split根據\t

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; 
     //... 
     } 
    } 
} 
+0

我在BQ2retrievedNum = columns [2];我的數組只有一個元素。我該如何解決這個問題? – JavaCodeBuilder

+0

在嘗試訪問此元素之前,您可以擁有一個「if」。 – Maroun

+0

(更正,例外是在BQ2retrievedNum = columns [1])我試圖添加一個'if'語句,它似乎沒有幫助。你能給我一個你的意思嗎? – JavaCodeBuilder

相關問題