Chyba - základ – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Chyba - základ – Java – Fórum – Programujte.comChyba - základ – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Neznalec0
Duch
4. 1. 2015   #1
-
0
-

Zdravím,

mám chybu v rozdělaným příkladu, poradil by někdo. Jsem samouk a podle toho to vypadá.

Chyba se nalézá v 73,83 a 84 řádku.

  Hlavní třída:

package bankomat;

import java.util.*;

/**
 *
 * @author marek
 */
public class Bankomat {

    private int hotovost;
    SeznamZakazniku[] pole = new SeznamZakazniku[50];
    
    public Bankomat(int hotovost) {
        this.hotovost = hotovost;
    }

    public static int NactiInt() {
        do {
            try {
                Scanner sc = new Scanner(System.in);
                int i = sc.nextInt();
                sc.nextLine(); /* Vyprázdní Buffer klávesnice*/

                return i;
            } catch (InputMismatchException e) {
                System.out.println("Něco jste zadal špatně! \n Zkuste to znovu: ");
            }
        } while (true);
    }

    public static String NactiString() {
        Scanner sc = new Scanner(System.in);
        String text = sc.nextLine();
        return text;
    }

    public static void UvodniMenu() {
        System.out.println("\n DBank Vás vítá. Postupujte dle seznamu. \n");
        System.out.println(" 1. Vytvoř zákazníka\n 2. Vypsat zákazníky\n 3. Přihlásit se do bankomatu\n 4. Odejít \n");
        Volba();
    }

    public static void Volba() {
        int i = NactiInt();
        switch (i) {
            case 1:
                VytvoreniZakaznika();
                break;
            case 2:
                VypisZakazniku();
                break;
            case 3:
                System.out.println("Přihlásit se do bankomatu");
                break;
            case 4:
                System.out.println("Program byl ukončen");
                System.exit(0);
            default:
                System.out.println("Neplatný výběr možnosti. Zkuste to znovu");
                Volba();
        }
    }

    public static void VytvoreniZakaznika() {
        int pocetzakazniku = 0;
        
        System.out.println("Zadejte prvních pět čísel karty: ");
        int cislokarty = NactiInt();
        System.out.println("Zadejte čtyřmístný pin: ");
        int pin = NactiInt();
        System.out.println("Zadejte kolik jste vložil peněz na účet: ");
        int stavkonta = NactiInt();
        System.out.println("Zadejte jméno klienta: ");
        String jmeno = NactiString();
        pole[pocetzakazniku] = new Zakaznik(cislokarty, pin, stavkonta, jmeno);
        pocetzakazniku = pocetzakazniku + 1;
        System.out.println(" \n Právě přibyl nový klient, děkujeme.");
        UvodniMenu();
    }

    public static void VypisZakazniku() {
        for (int i = 0; i < pole.length; i++) {
            System.out.println(pole[i+1] + "." + " Klient: " + ((Zakaznik) pole[i]).getJmeno() + "| karta: " + ((Zakaznik) pole[i]).getCisloKarty() + "| pin: " + ((Zakaznik) pole[i]).getPin() + "| Stav konta: " + ((Zakaznik) pole[i]).getStavKonta());
       }
    }

    public static void main(String[] args) {
        Bankomat b1 = new Bankomat(200000);
        Bankomat.UvodniMenu();
    }

Zde ještě další moje třídy:


package bankomat;

/**
 *
 * @author marek
 */
public class Zakaznik implements SeznamZakazniku {

    private int cislokarty;
    private int pin;
    private int stavkonta;
    private String jmeno;
  
    public Zakaznik(int cislokarty, int pin, int stavkonta, String jmeno) {
        this.cislokarty = cislokarty;
        this.pin = pin;
        this.stavkonta = stavkonta;
        this.jmeno = jmeno;
    }
    
    public int getCisloKarty() {
        return cislokarty;
    }

    public void setCisloKarty(int cislokarty) {
        this.cislokarty = cislokarty;
    }

    public int getPin() {
        return pin;
    }

    public void setPin(int pin) {
        this.pin = pin;
    }

    public double getStavKonta() {
        return stavkonta;
    }
    
    public void setStavKonta(int stav) {
        this.stavkonta = stavkonta;
    }

    public String getJmeno() {
        return jmeno;
    }

    public void setJmeno(String jmeno) {
        this.jmeno = jmeno;
    }
}

tuhle třídu jsem okoukal v jiným programu a abych se přiznal nevím k čemu přesně je.

package bankomat;

/**
 *
 * @author marek
 */
public interface SeznamZakazniku {
    
}

Budu rád za jakoukoli radu, která mi pomůže se tím prokousat.

Ještě v jiném vlákně (zde na foru) jsem vyčetl, že nemůžu pracovat s variable(proměnnou) v metodě, která je static, když proměnná není static.

Nahlásit jako SPAM
IP: 178.255.168.–
Reklama
Reklama
q
~ Anonymní uživatel
219 příspěvků
4. 1. 2015   #2
-
0
-

Ano, všude zruš ten static.

Nahlásit jako SPAM
IP: 213.211.51.–
q
~ Anonymní uživatel
219 příspěvků
4. 1. 2015   #3
-
0
-

Teda, samozřejmě zůstane u main a teoreticky má smysl ještě u NactiInt a NactiString, ale jinde ne.

A ten "pohybu" v menu asi funguje, ale jinak je blbě. Když se chceš z metody vrátit zpátky, tak se z ní vracej zpátky, nevolej z ní nadřazenou metodu. Stejně tak to opakování volby...

Nahlásit jako SPAM
IP: 213.211.51.–
Neznalec
~ Anonymní uživatel
10 příspěvků
4. 1. 2015   #4
-
0
-

S těma static mě to taky napadlo ale potom to hlásí v mainu u příkazu bankomat.UvodniMenu(); tuto hlášku:

non-static method UvodniMenu() cannot be referenced from a static context

To mám volat jinak?

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #5
-
+1
-
Zajímavé

#4 Neznalec
Má tam být přece volání metody objektu. Tedy 

b1.UvodniMenu();

Doporučuji metodu přejmenovat, není podle konvencí.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #6
-
0
-

Tak Volbu jsem vyřešil takto:  

public void Volba() {
        int i;
        do{
        i = NactiInt();
            switch (i) {
                case 1:
                    VytvoreniZakaznika();
                    break;
                case 2:
                    VypisZakazniku();
                    break;
                case 3:
                    System.out.println("Přihlásit se do bankomatu");
                    break;
                case 4:
                    System.out.println("Program byl ukončen");
                    System.exit(0);
                default:
                    System.out.println("Neplatný výběr možnosti. Zkuste to znovu");
            }
        } while (i > 4);
    }

a metodu UvodniMenu jsem změnil na Uvodnimenu. Tak jste to myslel?

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #7
-
0
-

#6 Neznalec
Název metody má začínat malým písmenem a má to být sloveso nebo alespoň začínat slovesem.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:1d91:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #8
-
0
-

Upraveno.

Snad už naposled. Nerad otravuji ale u výpisu zákazníků mi to hází NullPointerException. Dočetl jsem se, že nastává při práci s proměnnou, která obsahuje hodnotu null. 

Nahlásit jako SPAM
IP: 178.255.168.–
Neznalec0
Duch
4. 1. 2015   #9
-
0
-

dobrý už jsem to vyřešil.

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #10
-
0
-

#8 Neznalec
Místo pole.legth tam má být pocetzakazniku.

Až se naučíš dělat s kolekcemi, místo pole použij seznam.

Místo té nudle s gettery si ve třídě Zakaznik nadefinuj metodu toString(). Gettery pak můžeš zrušit.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:21fe:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #11
-
0
-

Měl bych další dotaz. 

Používám tento můj paskvil pro pokračování v programu:

System.out.println("Pro navrácení do hlavního menu napište jedničku a stiskněte enter");
do{
	menu=nactiInt();
        if(menu == 1){
            menu1();	/*tam se chci dostat*/
     }else{
     	 System.err.println("Špatně zadáno");
        }

Prosím jak napsat aby uživatel mohl pro pokračování stisknout pouze enter?

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #12
-
0
-

#11 Neznalec
Musíš to načíst jako String.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #13
-
0
-

Vám se musí z mých paskvilů kroutit prsty. :D

Děkuji moc za vytrvalost

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #14
-
0
-

#13 Neznalec
Nikdo učený z nebe nespadl. Kdybych to kdysi nevyčetl od Herouta, tak bych to asi také nevěděl.

Těch nesmyslů tam máš víc. Například číslo karty ani PIN nesouvisí se zákazníkem. Proto by měly být v samostatné třídě. Totéž s kontem. Zkoušej varianty.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #15
-
0
-

Taky právě čtu Herouta (java5) i když nato můj program nevypadá :D.

hlavní třída: 

package bankomat;

import java.util.*;

/**
 *
 * @author marek
 */
public class Bankomat {

    int pocetklientu=1;
    private int hotovost;
    SeznamKlientu[] pole = new SeznamKlientu[50];

    public Bankomat(int hotovost) {
        this.hotovost = hotovost;
    }

    public static int nactiInt() {
        Scanner sc = new Scanner(System.in);
        int i;
        do {
            try {
                i = sc.nextInt();
                sc.nextLine(); /* Vyprázdní Buffer klávesnice*/

                return i;
            } catch (InputMismatchException e) {
                System.out.println("Chybné zadání! \n Zkuste to znovu: ");
                sc.nextLine(); /* Vyprázdní Buffer klávesnice*/

            }
        } while (true);
    }

    public static String nactiString() {
        Scanner sc = new Scanner(System.in);
        String text = sc.nextLine();
        return text;
    }

    public void menu1() {
        System.out.println("---------------------------------\n ZCUBank Vás vítá.\n");
        System.out.println(" 1. Vytvoř klienta\n 2. Vypsat klienty\n 3. Přihlásit se do bankomatu\n 4. Odejít \n");
        volba();
    }

    public void volba() {
        int i;
        do {
            i = nactiInt();
            switch (i) {
                case 1:
                    vytvorKlienta();
                    break;
                case 2:
                    vypisKlienty();
                    break;
                case 3:
                    prihlasKlienta();
                    break;
                case 4:
                    System.out.println("Program byl ukončen");
                    System.exit(0);
                default:
                    System.out.println("Neplatný výběr možnosti. Zkuste to příště");
            }
        } while (i < 4);
    }

    public int zadejKartu(){
    boolean ok = false;
        System.out.println("Zadejte prvních pět čísel vaší karty: ");
        int cislokarty = nactiInt();
        if (cislokarty < 100000 && cislokarty > 9999) {
            for (int i = 1; i < pole.length; i++) {
                if (pole[i] != null) {
                    if (((Klient) pole[i]).cislokarty == cislokarty) {
                        ok = true;
                        if (ok == true) {
                            System.err.println("Tato karta už existuje!");
                            vytvorKlienta();
                        } else {
                            return cislokarty;
                        }
                    }
                }
            }
        } else {
            System.err.println("Vypište pouze prvních pět čísel vaší karty");
            vytvorKlienta();
        }
    return cislokarty;
    }
    
    public int zadejPin(){
    System.out.println("Zadejte čtyřmístný pin: ");
        int pin = nactiInt();
        if (pin < 10000 && pin > 999){
        return pin;
        }else {
           System.err.println("Pin kod musí obsahovat pouze čtyři čísla");
           zadejPin(); 
        }
    return pin;
   }
    
    public int zadejStavKonta(){
        System.out.println("Zadejte kolik jste vložil peněz na účet: ");
        int stavkonta = nactiInt();
        if (stavkonta > 0){
        return stavkonta;
        }else {
           System.err.println("stav konta nemůže být záporný");
           zadejStavKonta(); 
        }
    return stavkonta;
    }
    
    public void vytvorKlienta() {
        int cislokarty = zadejKartu();
        int pin = zadejPin();
        int stavkonta = zadejStavKonta();
        System.out.println("Zadejte jméno klienta: ");
        String jmeno = nactiString();
        pole[pocetklientu] = new Klient(cislokarty, pin, stavkonta, jmeno);
        pocetklientu = pocetklientu + 1;
        System.out.println(" \n *****Právě přibyl nový klient, děkujeme.*****");
        menu1();
    }

    
    
    public void vypisKlienty() {
        for (int i = 0; i < pole.length; i++) {
            if (pole[i] != null) {
                System.out.println(+(i) + "." + " Klient: " + ((Klient) pole[i]).getJmeno() + "| karta: " + ((Klient) pole[i]).getCisloKarty() + "| pin: " + ((Klient) pole[i]).getPin() + "| Stav konta: " + ((Klient) pole[i]).getStavKonta());
            }
        }
        System.out.println("Pro navrácení do hlavního menu stiskněte enter");
         int menu;
        do{ menu=nactiInt();
        if(menu == 1){
            menu1();}else{
        System.err.println("Špatně zadáno");
        }
        }while(false);
    }

    public void prihlasKlienta() {
        System.out.print("Zadejte číslo vaší karty (prvních pět číslic): ");
        int cislokarty = nactiInt();
        System.out.print("Zadejte PIN vaší karty: ");
        int PIN = nactiInt();
        int poradivpoli = 0;
        int ok = 0;
        for (int i = 0; i < pole.length; i++) {
            if (pole[i] != null) {
                if (((Klient) pole[i]).getCisloKarty() == cislokarty && ((Klient) pole[i]).getPin() == PIN) {
                    ok = 1;
                    poradivpoli = i;
                }

            }
        }
        if (ok == 1) {
            do {
                System.out.println("------------------------\n Vítejte ve svém účtu\n");
                System.out.println(" 1. Vložit peníze\n 2. Vybrat peníze\n 3. Vypsat aktulální zůstatek\n 4. Odhlásit se \n-----------------------");
                int volba = nactiInt();

                if (volba == 1) {
                    System.out.println("Vložit peníze");
                    System.out.print("Částka, kterou si přejete uložit: ");
                    int castka = nactiInt();
                    ((Klient) pole[poradivpoli]).stavkonta += castka;
                    System.out.println("Na Váš účet byla uložena částka: " + castka + " Kč");
                    System.out.println("Váš aktuální zůstatek: " + ((Klient) pole[poradivpoli]).getStavKonta() + " Kč");
                }

                if (volba == 2) {
                    System.out.println("Vybrat peníze");
                    System.out.print("Částka, kterou si přejete vybrat: ");
                    int castka = nactiInt();
                    int penize = hotovost;
                    try { 
                        penize -= hotovost;
                    }catch (BankomatException be) {
                                    System.out.println("Vyhledejte jiný bankomat");
                                    System.out.println(be.getMessage());
                                    be.printStackTrace();
                                }
                    if (castka > 0) {
                        if (pole[poradivpoli] != null) {
                            if (((Klient) pole[poradivpoli]).getStavKonta() >= castka) {
                                
                                    ((Klient) pole[poradivpoli]).stavkonta -= castka;
                                System.out.println("Z vašeho účtu byla vybráno: " + castka + " Kč");
                                System.out.println("Váš aktuální zůstatek: " + ((Klient) pole[poradivpoli]).getStavKonta() + " Kč");
                                }
                                
                            } else {
                                System.err.println("Z účtu není možné vybrat tolik peněz");
                            }
                        }
                    }
                

                if (volba == 3) {
                    System.out.println("Váš aktuální zůstatek: " + ((Klient) pole[poradivpoli]).stavkonta + " Kč");
                }

                if (volba == 4) {
                    ok = 0;
                    break;
                }
            } while (ok == 1);
        } else {
            System.err.println("Špatné číslo karty nebo heslo!");
        }
    }

    public static void main(String[] args) {
        Bankomat b1 = new Bankomat(200000);
        b1.menu1();
    }

}

klient.java:


package bankomat;

/**
 *
 * @author marek
 */
public class Klient implements SeznamKlientu {

    int cislokarty;
    private int pin;
    int stavkonta;
    private String jmeno;
  
    public Klient(int cislokarty, int pin, int stavkonta, String jmeno) {
        this.cislokarty = cislokarty;
        this.pin = pin;
        this.stavkonta = stavkonta;
        this.jmeno = jmeno;
    }
    
    public int getCisloKarty() {
        return cislokarty;
    }

    public void setCisloKarty(int cislokarty) {
        this.cislokarty = cislokarty;
    }

    public int getPin() {
        return pin;
    }

    public void setPin(int pin) {
        this.pin = pin;
    }

    public double getStavKonta() {
        return stavkonta;
    }
    
    public void setStavKonta(int stav) {
        this.stavkonta = stavkonta;
    }

    public String getJmeno() {
        return jmeno;
    }

    public void setJmeno(String jmeno) {
        this.jmeno = jmeno;
    }

    public String toString() {
        return super.toString() + " Klient: " + getJmeno() + ", Cislo karty: " + getCisloKarty() + ", PIN: " + getPin() + ", Stav konta: " + getStavKonta();
    }
    public void tisk() {
        System.out.println("" + toString());
    }

}

BankomatException.java:

package bankomat;

/**
 *
 * @author marek
 */
public class BankomatException extends Exception {

    public BankomatException() {
        super("Bankomat dočasně mimo provoz");
    }
}

Poslední co bych dneska chtěl dořešit. Pokouším se o výjimku kdy dojde k vybrání zásob bankomatu (řádek 197-203).

Hází mi chybu: exception BankomatException is never thrown in body of corresponding try statement

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #16
-
+1
-
Zajímavé

#15 Neznalec

PIN není číslo. Je to řetězec 4 číslic. Mělo by se s ním tak zacházet. Podobně jako číslo karty, rodné číslo ani telefonní číslo nejsou čísla, ale posloupnosti číslic - tedy stringy.

V té nudli se mi fakt nechce hledat chyba. Takhle dlouhé třídy se nedělají. Máš i příliš dlouhé řádky a při rolování ztrácím kontext.  Až to budeš psát objektově, tak to rozděl na víc tříd a zkrať řádky - 80 znaků max. Z třídy klient můžeš vyházet zbytečné (všechny) gettery a settery.

Řádek 197 by vůbec neměl existovat. Jak ho mám najít, když tady není číslování řádků? Zkrať třídy tak, aby nepřekročily 60-80 řádek.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #17
-
0
-

Tak nějak jsem tušil, že se to nikomu líbit nebude. Shit, celý předělat   

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #18
-
0
-

#17 Neznalec
Nevěš hlavu. Ostatní mě tady už znají, že na cizím programu nenechám nitku suchou :-)

Zkus potom knihu od Bruce Eckela: Myslíme v jazyku Java.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Neznalec0
Duch
4. 1. 2015   #19
-
0
-

Tu  "bohužel" taky mám právě na stole.

Pak ještě Začínáme programovat v jazyce JAVA od  J. CHapmana

a následně JAVA SCRIPT od Davida Morkese

Knih by bylo jen ta hlava není :D

Nahlásit jako SPAM
IP: 178.255.168.–
Kit+11
Guru
4. 1. 2015   #20
-
0
-

#19 Neznalec
Mně se ta kniha od Eckela líbila tím, že od začátku vysvětlovala principy OOP a na Javu samotnou se dostalo až později. Nevím, jak moc je kvalitní český překlad, ale ta anglická verze je super.

Podle Eckelovy knihy jsem se naučil i psát testy a dnes na ně nedám dopustit. V podstatě pak zapomeneš, co to je "hledat chyby v programu". Te to však pokročilejší technika, časem se k ní také dostaneš.

Javascript s Javou (kromě podobné syntaxe) nemá nic společného.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Podobná vlákna

Chyba -základ Java — založil PetrX

Základ:dědičnost — založil xJakubS

Delphi - základ — založil samouk

Zaklad MATLABU — založil pietro62

Umím základ, co dál? — založil czbero

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý