NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
michal.smatlak:17.12.2017 15:19

Zdravím chcem sa spýtať ako mám v case volať metódu s parametrami. Tu je môj kód case:

switch (znak){
                    case 'A':
                        this.novaZakazka();
                        break;
                    case 'B':
                        this.zobrazZakazku();
                        break;
                    case 'C':
                        this.zmazZakazku();
                        break;
                    case 'D':
                        this.zobrazVsetkyZakazky();
                        break;

a tu je kód metódy novaZakazka:

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));

keď som v case použil iba

this.novaZakazka();

tak mi pri kompilácií vyhodilo error kvôli tomu že som k metóde nepripísal parametre, keď som ale použil toto

this.novaZakazka(String datum, String nazovAuta, String typOpravy, String menoZakaznika, String telefon, int cena);

tak mi to zase vyhadzuje že mi tam chýba zátvorka čo si ale myslým že je blbosť, a keď som použil toto

this.novaZakazka(datum, nazovAuta, typOpravy, menoZakaznika, telefon, cena);

tak mi vyhadzuje chybu pre nedefinované premenné. Ako teda mám v case volať metódu s parametrami aby mi to fungovalo? Lepšie povedané, dá sa takáto metóda v case použiť? Poradte mi prosím Vás ako to urobiť. Potrebujem súrne poradiť. Za všetky rady vopred ďakujem.

 
Odpovědět
17.12.2017 15:19
Avatar
Odpovídá na michal.smatlak
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;
    }

}
Nahoru Odpovědět
17.12.2017 17:19
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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?

 
Nahoru Odpovědět
17.12.2017 20:05
Avatar
Odpovídá na michal.smatlak
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;
        }
    }
}
Nahoru Odpovědět
17.12.2017 20:26
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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.Input­MismatchExcep­tion: null (in java.util.Scanner). Poraď mi prosím ťa ako to vyriešiť aby to fungovalo.

 
Nahoru Odpovědět
18.12.2017 9:51
Avatar
Odpovídá na michal.smatlak
Matúš Olejník:18.12.2017 10:01

Zadaj dátum stlač enter, zadaj názov stlač enter atď

Nahoru Odpovědět
18.12.2017 10:01
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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.NullPo­interException: null

 
Nahoru Odpovědět
18.12.2017 10:24
Avatar
Odpovídá na michal.smatlak
Matúš Olejník:18.12.2017 10:28

Ukáž ten kód

Nahoru Odpovědět
18.12.2017 10:28
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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);
 
Nahoru Odpovědět
18.12.2017 11:13
Avatar
Odpovídá na Matúš Olejník
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

 
Nahoru Odpovědět
18.12.2017 11:17
Avatar
Odpovídá na michal.smatlak
Matúš Olejník:18.12.2017 11:34

hmm tak napíš ešte vstup pri ktorom dostaneš chybu

Nahoru Odpovědět
18.12.2017 11:34
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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.

 
Nahoru Odpovědět
18.12.2017 11:51
Avatar
Odpovídá na michal.smatlak
Matúš Olejník:18.12.2017 13:57

Pozri správu

Nahoru Odpovědět
18.12.2017 13:57
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na michal.smatlak
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 :)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.12.2017 14:43
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejní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ť.

 
Nahoru Odpovědět
18.12.2017 15:20
Avatar
Odpovídá na michal.smatlak
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.

Nahoru Odpovědět
18.12.2017 19:33
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.