Diskuze: case - volanie metódy s parametrami
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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;
}
}
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?
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;
}
}
}
č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.
Zadaj dátum stlač enter, zadaj názov stlač enter atď
zadal som dátum stlačil enter, zadal som názov stlačil enter a vyhodilo mi chybu java.lang.NullPointerException: null
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);
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
hmm tak napíš ešte vstup pri ktorom dostaneš chybu
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.
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
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ť.
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.