Scanner problem z wczytywaniem danych.

0

Witam.
Mam metodę dodajDomek i w niej chcę do ArrayListy dodawać domki, wszystko niby działa, ale po uruchomieniu maina i wywołaniu metody dodajDomek mam coś takiego.

Ile domków chcesz dodać?
2
Podaj nazwę domku
Podaj liczbę pokoi
f

A tu kod błędu.

Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at java.util.Scanner.nextInt(Unknown Source)
	at java.util.Scanner.nextInt(Unknown Source)
	at Domek.dodajDomek(Domek.java:34)
	at Main.main(Main.java:9)

Nie wiem czemu dwa polecenia wyświetlają się naraz po wpisaniu liczby domków do dodania.
Kod.

import java.util.ArrayList;
import java.util.Scanner;

public class Domek{
        int liczbaPok = 1;
        int liczbaLoz = 2;
        int cenaLoz = 1;
        String nazwa = "dads";
        public Domek(){
        	
        }
        public Domek(String nazwa, int liczbaPok, int liczbaLoz, int cenaLoz){
                this.liczbaPok = liczbaPok;
                this.liczbaLoz = liczbaLoz;
                this.cenaLoz = cenaLoz;
                this.nazwa = nazwa;
        }
        public String toString(){
        	System.out.println("Dodałeś z powodzeniem domek: ");
                return  nazwa+" ;Ilość pokoi: "+liczbaPok+" ;Ilość łóżek: "+liczbaLoz+ " ;Cena łózka: "+cenaLoz;
        }
 
        public void dodajDomek(){
        	Scanner skaner = new Scanner(System.in);
        	ArrayList<Domek> tablica = new ArrayList<Domek>();  
        	System.out.println("Ile domków chcesz dodać?");
        	int ileDomkow = skaner.nextInt();
        	
        	for(int i=0;i<ileDomkow;i++){
        		
        		System.out.println("Podaj nazwę domku");
        		nazwa = skaner.nextLine();
        		System.out.println("Podaj liczbę pokoi");
        		liczbaPok = skaner.nextInt();
        		System.out.println("Podaj liczbę łóżek");
        		liczbaLoz= skaner.nextInt();
        		System.out.println("Podaj cenę łóżka");
        		cenaLoz =skaner.nextInt();
        		skaner.close();
        		tablica.add(i, new Domek(nazwa,liczbaPok,liczbaLoz,cenaLoz));
        		System.out.println(tablica);
        	}
        	
            //for (Domek d:tablica){
    			//System.out.println(tablica);
    		//}
    	}
}
0

dodaj:
skaner.nextLine();
na samym początku pętli.

0

Skaner.nextInt pomija białe znaki przed intem, a więc nie przechodzi za koniec linii, wobec czego nextLine może czasem zwrócić pustego Stringa.

0

Mam teraz jeszcze jeden problem, chcę wyświetlić cenę łóżka w domku jeśli ten domek posiada np. 3 łóżka. Problem polega na tym, że Dane do domku dodaję do ArrayListy do jednego indexu więc nie wiem jak wyciągnąć teraz spod tego indexu zmienną liczbaPok i cenaLoz.
Próbuję tak.

public void cenaLozkaZPokojami(int ileMaBycPok){
        	System.out.println("Podaj ile ma być pokoi w domku");
        	ileMaBycPok = skaner.nextInt();
        	if(tablica.get(liczbaPok)<ileMaBycPok){
        		
        	}
1

tablica.get(i).liczbaPok

0

a czemu i ? mógłbyś wytłumaczyć?

0

Jeszcze jedno na szybko, jak bym chciał użyć już utworzoną ArrayListę (tablica) w klasie Domek w innej klasie to co muszę zrobić? wystarczy że dziedziczy po Domek? Bo coś mi to nie działa:(

0
  1. przekazać jako parametr w konstruktorze.
  2. przekazać do odpowiedniej metody
  3. Przekazać przez konstruktor samą klasę Domek, zaś tablicę dać jako publiczną, lub dać odpowiedniego gettera
  4. i jeszcze dużo różnych innych bardziej dziwacznych wariantów ...
0

Kurdę no myślę szukam w necie ale jakoś nie mogę na to wpaść trzecia opcja to w ogóle nie wiem jak dodać do konstruktora klasę :P Mógłbyś mi coś podpowiedzieć jeszcze co do opcji pierwszej i drugiej ?:)

0
  1. Poniższa definicja jest zła:
        public String toString(){
                System.out.println("Dodałeś z powodzeniem domek: "); //ten wiersz należy usunąć
                return  nazwa+" ;Ilość pokoi: "+liczbaPok+" ;Ilość łóżek: "+liczbaLoz+ " ;Cena łózka: "+cenaLoz;
        }

Każde wyświetlenie informacji o pokoju wyświetli niepotrzebny i raczej nieprawdziwy komunikat "Dodales z powodzeniem domek". Przy okazji, potrafisz na konsoli wyświetlać polskie litery?
2. ArrayList<Domek> tablica musi być polem w klasie, a nie zmienną lokalną metody dodajDomek(). Nazwa metody tez jest raczej niewłaściwa, proponuję dodajDomki(). Wywołanie

tablica = new ArrayList<Domek>() powinno być w konstruktorze, a nie w metodzie dodajDomek().
  1. Jeżeli jakaś klasy ma korzystać ze zmiennej tablica, to ta klasa musi być jakoś związana z klasą Domek:
  • obiekt typu InnaKlasa jest tworzony w klasie Domek,
  • obiekt typu Domek jest tworzony w klasie InnaKlasa,
  • istnieje trzecia klasa, która tworzy obiekty typu Domek oraz InnaKlasa.
    Poniżej jest rozwiązanie dla pierwszego przypadku.
        public Domek(String nazwa, int liczbaPok, int liczbaLoz, int cenaLoz){
                this.liczbaPok = liczbaPok;
                this.liczbaLoz = liczbaLoz;
                this.cenaLoz = cenaLoz;
                this.nazwa = nazwa;
                new InnaKlasa(this);
        }
public class InnaKlasa
{
      Domek domek = null;
      public InnaKlasa(Domek domek);
      {
          this.domek = domek;
      }
}
0

wow super co do 1 to się sam skapowałem po uruchamianiu programu i sobie poprawiłem, tutaj o tym zapomniałem. 2 poprawione nie wiedziałem o tym. co do 3 nie rozumiem czemu Domek domek =null; po co to jest?

0

W tym przykładzie nie ma to raczej znaczenia. Wszystko jedno czy napiszesz

Domek domek;
//czy
Domek domek = null;

zmienna domek będzie miała wartość null oznaczającą, że obiekt o nazwie domek jeszcze nie istnieje.
Inaczej jest przy tworzeniu zmiennych lokalnych

JPanel panel;
panel.setVisible(true);

się nie skompiluje

error: variable panel might not have been initialized

JPanel panel = null;
panel.setVisible(true);

przejdzie kompilację, ale będzie błąd wykonania (NPE).

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