Problem ze Scannerem oraz konstruktorami

0

Witam!

Mam problem ze wczytywaniem danych z pliku za pomocą Scannera. Otóż kod przedstawia się następująco:

package sklep;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


class Produkt{
    
    public String nazwa;
    public float cena;
    
    public Produkt(){
        
    }
    
    public void wyswietl()
    {
        System.out.println(nazwa+" "+cena);
    };
    
}

class Nabial extends Produkt{
    
    public float waga;
    
    public Nabial(){
        super();
        waga = waga;
    }
    
    public void wyswietl()
    {
        System.out.println(nazwa+" "+cena+" "+waga);
    };
}

class Rosliny extends Produkt{
    
    public String gatunek; 
           
    public Rosliny(){
        super();
        gatunek = gatunek;
    }
    
    public void wyswietl()
    {
        System.out.println(nazwa+" "+cena+" "+gatunek);
    }; 
}

class Chemia extends Produkt{
    
    public String przeznaczenie;
    
    public Chemia(){
        super();
        przeznaczenie = przeznaczenie;
    }
    
    public void wyswietl()
    {
        System.out.println(nazwa+" "+cena+" "+przeznaczenie);
    };
}
        
        
        
public class Sklep {

    
    public static void main(String[] args) throws FileNotFoundException {
        
        String pr="Produkt";
        String na="Nabial";
        String ro="Rosliny";
        String ch="Chemia";
        String klucz;
        
        Produkt tab[] = new Produkt[100];
        for(int i=0;i<tab.length;i++)
             tab[i] = new Produkt();
        
        int ile_jest= 0 ;
       /* List<Object> Produkt = new ArrayList<>();
        List<Object> Nabial  = new ArrayList<>();
        List<Object> Rosliny = new ArrayList<>();
        List<Object> Chemia  = new ArrayList<>();
        */
        
        
        
        Scanner sc = new Scanner(System.in);
        
        System.out.println(
         "0 - Menu \n"
         + "1 - wczytaj produkty z pliku \n"
         + "2 - wypisz produkty \n"
         + "3 -  \n"
         + "4 -  \n" 
         + "5 -  \n");
        
        int i = 0;
 
        while (i<20)
            {
                i = sc.nextInt();
                
         switch (i){
               
             case 0:
                     System.out.print("0 - Menu \n" );

                break;
            
             case 1:
                 System.out.println("wczytujemy z pliku txt");
                 //File file = new File("sklep.txt");
                 String nazwa="sklep.txt";
                 File in = new File(nazwa);
                 Scanner plik = new Scanner(in);
                    while(plik.hasNext() == false)
                  {
                      klucz = plik.next();
                      System.out.println("wczytujemy klucz ");
                      if(klucz.equals(pr)){
                          
                          int x = plik.nextInt();
                            for(int z=0; z<x ; z++)
                          {
                              Produkt tmp = new Produkt();
                              tmp.nazwa = plik.nextLine();
                              tmp.cena = plik.nextFloat();
                              
                              
                              tab[ile_jest]=tmp;
                              System.out.println(tab[ile_jest]);
                              ile_jest++;
                          }
                       klucz = plik.next();
                      }
                      
                      if(klucz.equals(na)){
                            int x = plik.nextInt();
                            for(int z=0; z<x ; z++)
                          {
                              Nabial tmp2 = new Nabial();
                              
                              tmp2.nazwa = plik.nextLine();
                              tmp2.cena = plik.nextFloat();
                              tmp2.waga = plik.nextFloat();
                              
                              tab[ile_jest]=tmp2;
                              System.out.println(tab[ile_jest]);
                              ile_jest++;
                              
                          }
                       klucz = plik.next();
                      }
                      
                      if(klucz.equals(ro)){
                            int x = plik.nextInt();
                            for(int z=0; z<x ; z++)
                          {
                              Rosliny tmp3 = new Rosliny();
                              tmp3.nazwa = plik.nextLine();
                              tmp3.cena = plik.nextFloat();
                              tmp3.gatunek = plik.nextLine();
                              
                              tab[ile_jest]=tmp3;
                              System.out.println(tab[ile_jest]);
                              ile_jest++;
                              
                          }
                       klucz = plik.next();
                      }
                      
                      if(klucz.equals(ch)){
                            int x = plik.nextInt();
                            for(int z=0; z<x ; z++)
                          {
                              Chemia tmp4 = new Chemia();
                              tmp4.nazwa = plik.nextLine();
                              tmp4.cena = plik.nextFloat();
                              tmp4.przeznaczenie = plik.nextLine();
                              
                              tab[ile_jest]=tmp4;
                              System.out.println(tab[ile_jest]);
                              ile_jest++;
                              
                          }
                       
                      }
                  }
                    plik.close();
                        System.out.println("koniec wczytywania");
                break;
                
                case 2:
                
                    
                
                    for(int j=0; j > ile_jest; j++)
                        {
                           System.out.println(tab[i]);
                        }
                
                
                break;
            }
                
                
            }}}
    


Po kompilacji wywala błąd oraz nic nie wczytuje, już nie wiem gdzie szukać przyczyny tego problemu. Dane w pliku wyglądają tak:

 Produkt
4
Zeszyt
2.00
Kredki
3.00
Klej
2.66
Taśma
1.99
Nabial
3
Ser
19.00
1.00
Jogurt
4.99
0.5
Maślanka
3.00
0.250
Rosliny
3
Banan
3.99
bananowate
Pomidor
2.99
krzaczaste
Jablko
1.99
grand
Chemia
3
Mydło Fa
0.99
higienia
Axe
12.99
żel pod prysznic
MrClean
6.99
Płyn do mycia okien

Wczytywanie odbywa się w sposób następujący: czytam linijkę i sprawdzam do jakiego typu obiektu przypisywać zmienne które wczytuję, następna linijka to ilość tworzonych obiektów, potem znowu lecą obiekty. Wszystko wrzucam do tablicy obiektów. Proszę o pomoc, chociaż błąd jest zapewne banalny.

Błędy:

Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Scanner.java:907)
	at java.util.Scanner.next(Scanner.java:1416)
	at sklep.Sklep.main(Sklep.java:135)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds) 
0

Błąd jest bardzo prosty i leży w tej linijce:

while(plik.hasNext() == false) // dopóki w pliku nic nie ma

Wyjątek NoSuchElementException w tym przypadku dotyczy czego innego, sprawdź sam (miejsce wystąpienia masz podane).

0

No nie wiem czy taki zaraz prosty.

Teoretycznie dałbym tam:

      while(plik.hasNext())

Ale dalej nie wejdę w pętlę, więc dostawiamy:

      while(!plik.hasNext())

Teraz w pętlę wchodzimy jednak dalej mamy błędy:

 wczytujemy klucz 
Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Scanner.java:907)
	at java.util.Scanner.next(Scanner.java:1416)
	at sklep.Sklep.main(Sklep.java:136)
Java Result: 1

Czyli dalej jest coś spieprzone, że tak brzydko się wyrażę.

Mógłbym też zmienić warunek, na:
while(in.canRead())

Również wejdę w pętlę, ale dalej mam błędy. Prosiłbym o sprawdzenie deklaracji klas.

0
                   //ten wiersz jest idiotyczny  while(plik.hasNext() == false)
                   while(plik.hasNext())
                  {
                      klucz = plik.next();
                      System.out.println("wczytujemy klucz ");
                      if(klucz.equals(pr)){
 
                          int x = plik.nextInt();
                            for(int z=0; z<x ; z++)
                          {
                              Produkt tmp = new Produkt();
                              tmp.nazwa = plik.nextLine();
                              tmp.cena = plik.nextFloat();
 
 
                              tab[ile_jest]=tmp;
                              System.out.println(tab[ile_jest]);
                              ile_jest++;
                          }
                       //po co jest ten wiersz? przy ostatnim czytanym produkcie wygeneruje błąd klucz = plik.next();
                      }

1 użytkowników online, w tym zalogowanych: 0, gości: 1