2013-06-11 3 views
1

J'ai un problème pour obtenir une méthode pour lire un fichier, puis le convertir en entier. Voici une brève explication du programme. Il s'agit essentiellement d'un inventaire de concessionnaires automobiles qui garde la trace des véhicules dans le lot en les gardant inscrits dans un fichier texte. Lorsque le programme démarre, il doit lire le fichier et mettre toutes les voitures actuelles dans un tableau afin qu'elles puissent être affichées. Ensuite, le reste du programme fera d'autres choses comme enlever des voitures et ajouter des nouvelles etc. La partie où je suis est quand le programme commence, il doit lire le fichier, mais je n'arrive pas à le faire fonctionner.Java: Problème de lecture du fichier texte puis conversion

Le fichier texte comprend 6 lignes au total; 4 chiffres d'abord puis 2 mots respectivement. Je veux que la méthode lise les quatre premières lignes et les convertisse en entiers et les stocke dans un tableau temporaire. Après cela, il lira les deux lignes suivantes et les stockera dans un tableau temporaire. Ensuite, je prends toutes ces valeurs stockées et les envoie à un constructeur. Le constructeur est ensuite stocké dans un Arraylist et l'Arraylist peut être consulté à tout moment. Dans la sortie, tout cela est très bien. Mais il veut passer à travers la méthode une deuxième fois malgré les barrières en place pour empêcher cela.

Voici le code. C'est une classe et non le programme principal. Je vais essayer d'expliquer le programme du mieux que je peux dans le code.

public class Vehicle { 

    //All the different private variables for the constructors and methods 
    private int intholder[], year, type, kilometres, price, loop; 
    private String make, model, myline, holder[]; 

    //The Arraylist that the different vehicle objects will be stored 
    ArrayList<Vehicle> allCars = new ArrayList<Vehicle>(); 

    //The Default constructor 
    public Vehicle(){ 
     make = "Vehicle Make"; 
     model = "Vehicle Model"; 
     type = 0; 
     year = 0; 
     kilometres = 0; 
     price = 0; 
    } 

    //The constructor that has information sent to it 
    public Vehicle(int _type, int _year, int _kilometres, int _price, String _make, String _model){ 
     make = _make; 
     model = _model; 
     type = _type; 
     year = _year; 
     kilometres = _kilometres; 
     price = _price; 
    } 
    //Text file information 
    /* 
    * CAR TYPE CODE: 
    * 1 - Sedan 
    * 2 - Truck 
    * 3 - Crossover 
    * 4 - SUV 
    * 5 - Sports 
    * 
    * There is a total of 6 lines for each car and are as follows 
    * 1 - int Type integer 
    * 2 - int Year 
    * 3 - int Kilometres 
    * 4 - int Asking price 
    * 5 - String Make 
    * 6 - String Model 
    */ 

    //The method in question. It reads through the file, converts the integers and stores them, 
    //stores the strings, and sends all the information to the constructor 
    public void readCars()throws IOException{ 
     BufferedReader readFile = new BufferedReader(new FileReader("C:/Users/David/Desktop/FinalProject/Carlot.txt")); 

     //Setting the length of the temporary arrays 
     holder = new String[2]; 
     intholder = new int[4]; 

     //The main loop in the method. 
     do{ 

      //Read the first 4 lines of the file and convert them to integers. 
      //The try catch shouldn't have to be there because the first 4 lines 
      //of the file are all numbers, but I put it in there to see when it was messing up. 
      for(int i = 0; i < 4; i++){ 
       myline = readFile.readLine(); 
       try{ 
        intholder[i] = Integer.parseInt(myline); 
       } 
       catch(NumberFormatException e){ 
        System.out.println(e); 
       } 

       //Had this in here to see how many lines down the file it would go before messing up. 
       System.out.println(myline); 
      } 

      //Loop to store the Strings 
      for(int i = 0; i < 2; i++){ 
       myline = readFile.readLine(); 
       holder[i] = myline; 
       System.out.println(myline); 
      } 

      //Sends all the data to the constructor 
      Vehicle V = new Vehicle(intholder[0], intholder[1], intholder[2], intholder[3], holder[0], holder[1]); 

      //Several if statements to determine which subclass of vehicle it is. 
      if(intholder[0]==1){ 
       Sedan S = new Sedan(); 
       allCars.add(S); 
      } 
      else if(intholder[0]==2){ 
       Truck T = new Truck(); 
       allCars.add(T); 
      } 
      else if(intholder[0]==3){ 
       Crossover C = new Crossover(); 
       allCars.add(C); 
      } 
      else if(intholder[0]==4){ 
       SUV U = new SUV(); 
       allCars.add(U); 
      } 
      else if(intholder[0]==5){ 
       Sports P = new Sports(); 
       allCars.add(P); 
      } 

     //Only break the loop if the myline equals null 
     }while(myline != null); 

     //if the loop breaks, close the file  
     readFile.close(); 
    } 

Maintenant, je pense que je sais où ça ne va pas. A la fin du do/while, il vérifie si "myline" est nul. Et parce que la dernière fois qu'il a lu le fichier c'était toujours une chaîne, la boucle continue. La dernière fois qu'il passe par la boucle, tout est nul, donc essayer de convertir l'entier est impossible, donc je reçois des erreurs. Mais je n'ai aucune idée de comment l'obtenir pour lire le fichier à la fin de la boucle sans passer à la ligne suivante. Voici à quoi ressemble le fichier texte.

1 
2007 
150250 
5000 
Toyota 
Corolla 
2 
2005 
240400 
4500 
Chevorlet 
Silverado 

Je ne peux pas l'avoir lu à la fin de la boucle parce que si elle le fait et il y a encore plus de voitures après celui que je viens de le faire, il va dans la ligne suivante lorsque la boucle redémarre tout est jeté de.

Toute aide est appréciée, merci!

+1

Votre question serait plus concise et plus facile à répondre si vous venez d'avoir une classe minimale, compilable et nous a dit votre production attendue vs réelle. –

+0

Tout ce que je m'attends à obtenir en sortie est exactement ce qu'il y a dans le fichier texte. En ce moment, je reçois ce qui est dans le fichier texte plus 6 autres lignes de null. – Dave555

+0

Etes-vous sûr qu'il n'y a pas de ligne vide en bas d'un fichier? Avez-vous envisagé d'ajouter un contrôle pour cela ainsi que null? Ou les lignes vides devraient-elles être autorisées? – efan

Répondre

1

Utilisez un Déclaration de rupture marquée dans vos boucles for simplement la sortie de la boucle principale do while lorsque myline devient null. La façon dont les autres objets sont instanciés dans la boucle ne laisse pas beaucoup de place pour un refactoring facile, d'où l'utilisation d'une rupture étiquetée ici.

outerloop: 
do { 

    for (int i = 0; i < 4; i++) { 
    if ((myline = readFile.readLine()) == null) break outerloop; 
    // .. 
    } 

    for (int i = 0; i < 2; i++) { 
    if ((myline = readFile.readLine()) == null) break outerloop; 
    // .. 
    } 

    // .. 
} while (myline != null); 
+0

J'ai essayé ceci, et cela a fonctionné! Merci! Bien que j'ai une question sur le contour externe. Lorsque vous utilisez ceci, cela ne concerne-t-il que la boucle qui se trouve en dessous? Merci encore. – Dave555

+1

Oui, c'est comme donner une étiquette (et une étiquette pourrait être n'importe quel texte comme mainloop etc.) à la boucle qui est juste en dessous. Mais, je vous suggère de garder toutes les données relatives à un seul véhicule sur la même ligne (comme des valeurs séparées par des virgules) dans votre fichier. Vous pouvez alors simplement vérifier EOF (fin du fichier) en cochant 'while (reader.readLine()! = Null)' et simplement 'line.split (", ")' chaque ligne pour traiter les valeurs. –

+0

Très bien à savoir, merci pour l'aide! – Dave555

0

Peut-être que vous pourriez utiliser une boucle while au lieu d'une do - boucle while et lire la ligne suivante du fichier avant toute autre chose. Quelque chose comme ceci:

String myline = null; 
while((myline = readFile.readLine()) != null) { 

    // All your logic... 

} 

readFile.close(); 

L'état while effectue les opérations suivantes: d'abord, lisez la ligne suivante du fichier avec myline = readFile.readLine(). La déclaration précédente renvoie la valeur de myline, maintenant nous vérifions qu'il est non nul avec la comparaison:

(myline = readFile.readLine()) != null