2016-11-16 1 views
0

Je construis un projet Java dans Netbeans. J'ai obtenu mon fichier de données (temperature.txt) qui contient les hautes et basses températures au format (bas) | (haut). Le fichier devrait charger dans le tableau à deux dimensions et ensuite l'imprimer à l'écran. Mais quand je lance mon projet Java, je suis tombé sur cette erreur et je suis complètement perdu. Mais je ne sais pas comment résoudre ce problème.Exception dans le fil "principal" java.lang.ArrayIndexOutOfBoundsException: 1

Temperature.text:

+-------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 
| Day   | 1  | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
+-------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 
| Temperature | 30|32 | 29|30 | 25|28 | 25|29 | 27|31 | 28|32 | 26|30 | 24|32 | 24|41 | 27|32 | 
+-------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 

Sortie:

Analysis report of the temperature reading for the past 10 days 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at Lab4Ex2.main(Lab4Ex2.java:48) 
C:\Users\User\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 
BUILD FAILED (total time: 0 seconds) 

Voici mon code:

import java.util.StringTokenizer; 
import java.io.*; 

public class Exercise { 

    public static void main(String[] args) { 

     StringTokenizer tokenizer; 
     String line; 
     String file="temperature.txt"; 
     int[][] temp=new int[10][2]; 
     int sumHigh, sumLow; 
     FileReader fr=null; 
     BufferedReader br=null; 

     try 
     { 
      fr=new FileReader(file); 
      br=new BufferedReader(fr); 

      line=br.readLine(); 
      System.out.println("Analysis report of the temperature reading for the past 10 days " + line); 

      String [] content=line.split("|"); 

      for(int row=0; row<=content.length; row++) 
      { 
       //I am trying to parse the two token into integer.. 

       if(row != 0) 
       { 
        try 
        { 
         //Parse first token into integer and store in current row column 0 
         if(row % 2 != 0) 
         { 
          sumLow = Integer.parseInt(content[row]); 
          temp[row][0]=Integer.parseInt(content[row]); <---Line 48 

         } 
         //Parse second token into integer and store in current row column 0 
         else if (row % 2 == 0) 
         { 
          sumHigh = Integer.parseInt(content[row]); 
          temp[row][1]=Integer.parseInt(content[row]); 
         } 
        } 
        catch(NumberFormatException e) 
        { 
         System.out.println("The code throws an exception"); 
        } 
       } 
       System.out.println(); 

      } 
      br.close(); 
     } 

     catch(FileNotFoundException e) 
     { 
      System.out.println("The file " + file + " was not found"); 
     } 
     catch(IOException e) 
     { 
      System.out.println("Reading error"); 
     } 
     catch(NumberFormatException e) 
     { 
      System.out.println("Parsing error"); 
     } 
     finally 
     { 
      if(fr != null) 
      { 
       try 
       { 
        fr.close(); 
       } 
       catch(IOException e) 
       { 
        System.out.println("Reading error"); 
       } 
      } 
     } 


    } 

} 
+0

Quelle ligne est 48? – bradimus

+0

Vous devriez savoir que 'split()' utilise un * regex *. En tant que tel, le '|' est un caractère spécial qui lui dit de chercher un délimiteur qui est "Soit ceci ou cela", dans ce cas "Soit rien ou rien". Ce n'est pas ce que vous vouliez. Vous devriez utiliser '\\ |' à la place. Mais vous avez beaucoup d'erreurs de logique dans votre programme en dehors de cela. – RealSkeptic

+0

'row <= content.length' ... ne devrait-il pas être inférieur à seulement? 'row

Répondre

0

Je ne sais pas si vous avez déjà demandé, mais Voici une solution de travail pour vous d'essayer. Le point clé que vous sembliez être en difficulté était qu'il n'y avait qu'une seule ligne du fichier qui contenait des données que vous vouliez lire. Je partage cette ligne en utilisant l'expression rationnelle suivante:

line.split(" \\| ?") 

Cela nous laisse avec des chaînes sous la forme 28|32 par exemple. Chacune de ces paires haute/basse peut être divisée en utilisant un tuyau (mais attention, vous devez sortir du tuyau, c'est-à-dire \\|). Enfin, les données peuvent être stockées dans votre tableau et sorties à la fin comme une vérification de la santé mentale.

public static void main(String[] args) { 
    String line; 
    String file = "temperature.txt"; 
    int[][] temp = new int[10][2]; 
    FileReader fr = null; 
    BufferedReader br = null; 

    try 
    { 
     fr = new FileReader(file); 
     br = new BufferedReader(fr); 

     // eat the first three lines, as they don't contain data you want to use 
     br.readLine(); 
     br.readLine(); 
     br.readLine(); 
     line = br.readLine(); 
     System.out.println("Analysis report of the temperature reading for the past 10 days " + line); 

     String [] content=line.split(" \\| ?"); 
     for (int i=1; i < content.length; ++i) { 
      String[] pair = content[i].split("\\|"); 
      temp[i-1][0] = Integer.parseInt(pair[0]); 
      temp[i-1][1] = Integer.parseInt(pair[1]); 
     } 
     System.out.println(Arrays.deepToString(temp)); 

    } 
    catch (Exception e) { 
     System.out.println("An exception occurred."); 
    } 
}