Diskuze: case - volanie metódy s parametrami
Matúš Olejník:17.12.2017 17:19
No veď tá chyba hovorí za všetko. Ak máš teda metódu
public void novaZakazka(String datum, String nazovAuta, String typOpravy, String menoZakaznika, String telefon, int cena) {
this.zakazky.add(new Zakazka(datum, nazovAuta, typOpravy, menoZakaznika, telefon, cena));
a voláš ju napr z metódy callNovaZakazka(), tak premenné ktoré chceš funkcii dať ako parametre musíš mať niekde zadefinované, či už priamo vo funkcii si ich zadefinuješ a inicializuješ alebo ich budeš mať globálne alebo staticky dosadíš nejakú hodnotu
public void callNovaZakazka(String znak){
String datum = "1.1.2017";
String nazovAuta = "nazov";
String typOpravy = "typ opravy";
String menoZakaznika = "Matus";
//premennú telefon nebudem definovať ale vložím priamo String ako paramter
int cena = 100000;
switch (znak){
case "A":
novaZakazka(datum, nazovAuta, typOpravy, menoZakaznika, "+420 111 222 333", cena);
break;
}
}
michal.smatlak:17.12.2017 20:05
Ja to chcem ale tak že v konzole užívateľ stlačí cez System.in písmeno "A" a bude môcť zadať parametre, nie ako ty hovoríš, mať niekde vopred zadefinované hodnoty. Čiže keby som spravil napríklad niečo takéto
this.novaZakazka(System.in, System.in, System.in, ...);
fungovalo by to? Alebo lepšie povedané aby najskôr zadal hodnoty cez System.in a potom stlačil písmeno?
Matúš Olejník:17.12.2017 20:26
To si v pôvodnej otázke nenapísal
public void callNovaZakazka(){
String datum, nazovAuta;
int cena;
Scanner scanner = new Scanner(System.in);
System.out.println("Zadajte pismeno");
znak = scanner.nextLine();
switch (znak){
case "A":{
System.out.println("Zadajte datum");
datum = scanner.nextLine();
System.out.println("Zadajte nazov auto");
nazovAuto = scanner.nextLine();
System.out.println("Zadajte cenu");
cena = scanner.nextInt();
novaZakazka(datum, nazovAuta, cena); //atd.
//alebo novaZakazka(scanner.nextLine(), scanner.nextLine(), scanner.nexInt());
break;
}
}
}
michal.smatlak:18.12.2017 9:51
čau, ja viem zabudol som to tam nejako napísať a ešte by ma zaujímalo, keď som použil tento zápis:
novaZakazka(scanner.nextLine(), scanner.nextLine(), scanner.nexInt());
ako mám tie údaje v konzole zapisovať. Má to byť v jednom riadku, pod sebou alebo ako, lebo keď som napríklad skúsil: "18.12.2017 Škoda Octavia 50" a stlačil som Enter tak kurzor hodilo do nového riadku a keď som stlačil ďalšie písmeno tak mi vyhodilo chybu java.util.InputMismatchException: null (in java.util.Scanner). Poraď mi prosím ťa ako to vyriešiť aby to fungovalo.
Matúš Olejník:18.12.2017 10:01
Zadaj dátum stlač enter, zadaj názov stlač enter atď
michal.smatlak:18.12.2017 10:24
zadal som dátum stlačil enter, zadal som názov stlačil enter a vyhodilo mi chybu java.lang.NullPointerException: null
michal.smatlak:18.12.2017 11:13
Tu je kód celej metódy v ktorej to chcem použiť:
private void hlavneMenu() {
boolean koniec = false;
do{
System.out.println("***************************************");
System.out.println("A-Nová zákazka");
System.out.println("B-Zobraz zákazku");
System.out.println("C-Zmaž zákazku");
System.out.println("D-Zobraz všetky zákazky");
System.out.println("E-Uprav stav zákazky");
System.out.println("F-Tlač lístok");
System.out.println("G-Zrátaj tržbu");
System.out.println("H-Zobraz počet vybavených zakaziek");
System.out.println("I-Zobraz počet nevybavených zakaziek");
System.out.println("J-Nový pracovník");
System.out.println("K-Zobraz pracovníka");
System.out.println("L-Zobraz všetkých pracovníkov");
System.out.println("M-Zmaž pracovníka");
System.out.println("N-Nový zákazník");
System.out.println("O-Zobraz zákaznika");
System.out.println("P-Zobraz všetkých zákazníkov");
System.out.println("Q-Zmaž zákazníka");
System.out.println("R-Koniec");
System.out.println("***************************************");
String volba = this.scan.nextLine();
if (volba.length() == 1) {
char znak = volba.charAt(0);
switch (znak){
case 'A':
System.out.println("Zadajte zákazku");
this.novaZakazka(scan.nextLine(), scan.nextLine(), scan.nextLine(), scan.nextLine(),
scan.nextLine(), scan.nextInt());
break;
case 'B':
System.out.println("Zadajte datum");
this.zobrazZakazku(scan.nextInt());
break;
case 'C':
this.zmazZakazku(scan.nextInt());
break;
case 'D':
this.zobrazVsetkyZakazky();
break;
case 'E':
this.upravStavZakazky(scan.nextInt());
break;
case 'F':
this.tlacListok(scan.nextInt());
break;
case 'G':
this.zratajTrzbu();
break;
case 'H':
this.zobrazPocetVybavenychZakaziek();
break;
case 'I':
this.zobrazPocetNevybavenychZakaziek();
break;
case 'J':
System.out.println("Zadajte meno, mzdu, dátum");
this.novyPracovnik(scan.nextLine(), scan.nextInt(), scan.nextLine());
break;
case 'K':
this.zobrazPracovnika(scan.nextInt());
break;
case 'L':
this.zobrazVsetkychPracovnikov();
break;
case 'M':
this.zmazPracovnika(scan.nextInt());
break;
case 'N':
this.novyZakaznik(scan.nextLine(), scan.nextLine(), scan.nextLine(), scan.nextLine());
break;
case 'O':
this.zobrazZakaznika(scan.nextInt());
break;
case 'P':
this.zobrazVsetkychZakaznikov();
break;
case 'Q':
this.zmazZakaznika(scan.nextInt());
break;
case 'R':
koniec = true;
break;
default:
System.out.println("***************************************");
System.out.println("ZLÁ VOĽBA");
System.out.println("***************************************");
}
} else {
System.out.println("***************************************");
System.out.println("ZLÁ VOĽBA");
System.out.println("***************************************");
}
}while(!koniec);
}
a samozrejme v konštruktore mám ešte:
this.scan = new Scanner(System.in);
michal.smatlak:18.12.2017 11:17
A toto je napríklad metóda novyPracovnik:
private void novyPracovnik(String menoPracovnika, int hodinovaMzda, String datumNastupu) {
this.pracovnici.add(new Pracovnik(menoPracovnika, hodinovaMzda, datumNastupu));
}
ktorá pridá pracovníka do ArrayListu
Matúš Olejník:18.12.2017 11:34
hmm tak napíš ešte vstup pri ktorom dostaneš chybu
michal.smatlak:18.12.2017 11:51
napríklad: stlačím "J" pre zadanie nového pracovníka, napíšem Michal, dám enter, 5 znova enter a hodí chybu a takto isto to je pri zákazke a všade inde.
Matúš Olejník:18.12.2017 14:43
Po tom čo si mi poslal tak v konštruktore voláš vypísnaie menu a následné čítanie inputu a pridávanie do array listu ešte pred tým než ho inicializuješ
private Autoservis() {
System.out.print("\f");
this.scan = new Scanner(System.in);
this.hlavneMenu(); //toto ma byt az na konci
this.zakazky = new ArrayList<Zakazka>();
this.pracovnici = new ArrayList<Pracovnik>();
this.zakaznici = new ArrayList<Zakaznik>();
this.pracovnik = new Random();
this.idPracovnika = 0;
//tuto this.hlavneMenu();
}
a následne hneď po tom čo pridáš zakázku tak máš
this.idPracovnika = this.pracovnik.nextInt(this.pracovnici.size());
čo ti tiež hodí chybu pretože pracovnici.size() je zatiaľ 0, ďalšie chyby som nehľadal, načítanie fungovalo správne treba nabudúce pozorne pozerať čo ti vytvára chyby
+20 Zkušeností
+2,50 Kč
michal.smatlak:18.12.2017 15:20
Vďaka ti za radu, funguje to. To s tými pracovníkmi viem, pred vytvorením, zákazky musím najskôr vytvoriť aspoň 1 pracovníka. Len ešte taká malá drobnosť: keď teda idem vytvoriť pracovníka, zadám meno stlačím enter hodí kurzor do nového riadku, zadám hodinovú mzdu napr. 5, stlačím enter a znova mi vygeneruje menu namiesto toho aby kurzor hodilo do nového riadku a mohol som zadať dátum nástupu pracovníka. Poraď mi prosím ťa ešte ako toto vyriešiť.
Matúš Olejník:18.12.2017 19:33
Máš pravdu, ak si to náhodou ešte nevygooglil tak môžeš pozrieť https://stackoverflow.com/…ther-nextfoo
Je to kvôli tomu že scan.nextInt() po načítaní čísla
nezoberie znak nového riadka (stlačenie enteru) a teda sa tento znak načíta
do toho tretieho scan.nextLine(), môžeš teda napr. namiesto
scan.nextInt() dať
Integer.parseInt(scan.nextLine())
a malo by to fungovať, podobne to platí aj u iných dátových typov.
Zobrazeno 16 zpráv z 16.