Zachytenie výnimky JOptionPane – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zachytenie výnimky JOptionPane – Java – Fórum – Programujte.comZachytenie výnimky JOptionPane – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Anonym
~ Anonymní uživatel
429 příspěvků
11. 5. 2014   #1
-
0
-

Zdravíčko,

naskytol sa mi nasledovný problém:

Od užívateľa vyžadujem zadanie mena do JOptionPane, žiadny problém by nebol, až na to, že ak stlačí Cancel, resp. zavrie ho, tak to vyhodí chyby, veľmi rád by som to ošetril nejakým jednoduchým, ale za to účinným spôsobom, toto je celý kód:

    public String meno() {
        
        String meno = JOptionPane.showInputDialog(this, "Zadaj meno:", "Meno!", JOptionPane.INFORMATION_MESSAGE);

        
        if (meno.equals("")) {
            meno = "Jozef";
            return meno;
        } else {
            return meno;
        }
    }

Neviem, ako presne tam aplikovať try a catch, prípadne, ako overiť, kedy stačil Cancel a kedy nie, to by sa mi zdá ako zaujímavá možnosť :)

Ďakujem

Nahlásit jako SPAM
IP: 95.105.244.–
Reklama
Reklama
sleepy
~ Anonymní uživatel
422 příspěvků
11. 5. 2014   #2
-
0
-

Skus taketo nieco:

public String getNameFromInputDialog() {
	String name;
	name = JOptionPanel.showInputDialog(this, "Zadaj meno");
	// Tu mozes vyuzit aj regex
	if (name == null || name.equals(""))
		// tu to spracujes alebo hodis vynimku a zachytis ju niekde inde
		// ja tu hodim vyniku
		throw new InvalidArgumentException("Invalid name");
}

A kde bude treba tam to odchytis.

Nahlásit jako SPAM
IP: 158.195.196.–
Flowy0
Věrný člen
11. 5. 2014   #3
-
0
-

#1 Anonym
davat tam vynimku sa mi zda overkill ... to tlacidlo cancel je tam preto aby sa to dalo normalne vypnut ... ak to budes riesit vynimkou ako potom budes riesit ked tu vynimku skutocne budes potrebovat (napr ked bude problem v systeme)

tlacidlo cancel je regulerna odpoved uzivatela ked program chce aby zadal nieco ... vrati hodnotu ktoru by potvrdenie nemalo vracat (napr v stringu vrati null) ... a ten kto dal poziadavku na zisk stringu by sa s tym mal vyrovnat ... robit kvoli beznej odpovedi vypis stacku neni dobre riesenie

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
Anonym
~ Anonymní uživatel
429 příspěvků
11. 5. 2014   #4
-
0
-

#3 Flowy

Problém je ale v tom, že ja nechcem, aby keď stačí Cancel aby boli vyhodené chyby. To konkrétne potrebujem nejako ošetriť, či už zistením, že stlačil Cancel a aplikáciu normálne ukončiť, alebo nejako tieto chyby odchytiť.

Nahlásit jako SPAM
IP: 95.105.244.–
sleepy
~ Anonymní uživatel
422 příspěvků
12. 5. 2014   #5
-
0
-

Tu je omnoho lepsie hodit vynimku. A spracovavat ju tam kde volas tuto metodu. Si predstav, ze budes mat nejaku default hodnotu, ktoru odosle ked stlaci uzivatel cancel. Spracovanie vynimky urobis nejak takto:

String name = null;
try {
	name = frame.getNameFromInputDialog();
} catch(InvalidArgumentExecption e) {
	e.printStackTrace();
	// log e
	System.exit(1);
}
// nieco vykonas s name

Da sa to aj bez vynimiek, casom pochopis preco to je horsie. Predpokladam ze ti to dava null a ten nevies metodou equals porovnat s prazdnym stringom. 

if (meno == null || meno.equals("")) {
	meno = "Jozef"; // Alebo
	// System.exit(1);
}
return meno;
Nahlásit jako SPAM
IP: 158.195.196.–
Flowy0
Věrný člen
12. 5. 2014   #6
-
0
-

#5 sleepy
ako moze byt vymena informacii prostrednictvom vynimky lepsie ako bezna komunikacia

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
sleepy
~ Anonymní uživatel
422 příspěvků
13. 5. 2014   #7
-
0
-

#6 Flowy
Informacie? Toto je vynimocna situacia, ked uzivatel stlaci Cancel. Cize odcakavas, ze to hodi vynimku. Program caka String, ale pravda ono to niekde hodi NullPointerException. Osetrujes to az na mieste, kde ten String naozaj potrebujes.

Nahlásit jako SPAM
IP: 158.195.196.–
z
~ Anonymní uživatel
268 příspěvků
13. 5. 2014   #8
-
0
-

Vyjímka je tady úplně na hovno. On už ošetřuje, že nic nebylo zadáno a nastavuje defaultní hodnotu. Jen mu tam chybí test na null, což už tady padlo několikrát. Není co dál řešit.

Nahlásit jako SPAM
IP: 88.101.8.–
Flowy0
Věrný člen
13. 5. 2014   #9
-
0
-

#7 sleepy
ziadas klienta aby zadal meno ... on sa rozhodne ze ho nezada ... uplne bezna odpoved ... ziadny dovod pouzivat vynimku ... len posielas spet informaciu o tom co si klient vybral a na to absolutne nepotrebujes parsovat msg z exception alebo citat stack (a este horsia moznost je vypisat ho)

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
Kit+11
Guru
13. 5. 2014   #10
-
0
-

#9 Flowy
Pokud uživatel klikne na "Cancel", je to normální reakce uživatele, není tedy žádoucí výjimku vyhazovat. Pokud však jako jméno vloží prázdný string, je to chybný vstup a proto je vyhození výjimky v pořádku.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
sleepy
~ Anonymní uživatel
422 příspěvků
13. 5. 2014   #11
-
0
-

#10 Kit
To je uplna pravda, ale podla mna zalezi dost od situacie. Skusme si predstavit taky priklad, ze budeme vytvarat noveho uzivatela a zapisovat do db. 

class User{
	private String username;
	private String password;
	// gettery a settery 
}

interface UICreateUser {
	public String askUserForName();

	public String askUserForPassword();

	// atd ...
}

class UserManager {
	private UICreateUser ui;
	// DI UICreateUser
	public CreateUser(UICreateUser ui) {
		this.ui = ui;
	}

	public User createNewUserFromUI() {
		User user = new User();
		Storage<User> storage = new Storage<>(User);
		try {
			// vynimku mozes hodit aj ked uzivatel pouzije
			// nepovolene znaky
			user.setUsername(ui.askUserForName());
			user.setPassword(ui.askUserForPassword());
			// ak to niekde hodi vynimku, tak sa to po commit nedostane
			storage.commit(); // som si z casti prebehol ako 
					// funguje hibernate.
		} catch (InvalidArgumentException e) {
			// log invalid ako INFO
			// je dobre mat aspon nejaku evidenciu
			// ze nieco bolo zle zadane
		}
	}
}

Je omnoho pohodlnejsie, ako este riesit ci klikol na cancel, alebo nie. Aj ked uznavam Cancel je normalna reakcia, ale stale je to invalid argument. Dalo by sa to pre pokoj v dusi vyriesit takto:

private Pattern validUsernamePattern = Pattern.compile("\\w+");

public String getNameFromInputDialog() {
	String name = JOptionPanel.createInputDialog(this, "Zadajte meno");
	if (name == null)
		name = "";
	// da sa este vyuzit regex aby sa predislo
	// nevhodnym uzivatelskym menam
	// vyluci sa aj moznost toho, ze je to prazdny String
	if (vaildUsernamePattern.matcher(name).matches())
		throw new InvalidArgumentException("Invalid username");
	return name;
}

Mozno je to mojou slabou predstavivostou, ale ina moznost ako odoslat referenciu na UserManager, ktory by obsahoval metodu cancel, alebo nieco poobne, ma nenapada. A ak by bola honota null, tak by volal cancel().

Nahlásit jako SPAM
IP: 158.195.196.–
Flowy0
Věrný člen
13. 5. 2014   #12
-
0
-

#10 Kit
prazdny vstup by som vobec neriesil a poslal dalej tak ako som ho dostal (nech si ho spracuje ten kto ho potrebuje) ... v buducnosti mozno bude existovat defaultny ucet alebo moznost nechat pole prazdne a tymto by si si spravil dost prace navyse (hlavne ked by si ten bug hladal)

o konzistenciu dat by sa mal starat prvok na najnizsej vrstve kde sa pouzivaju (pripadne ukladaju) ... ak zabezpecis ze ti do nizsej vrstvy nepojdu ulozit urcite stavy tak by si to mal kontrolovat aj nizsie ... co moze byt zbytocna redundancia (pripustam vynimky) ... cize to budes kontrolovat len na vyssej vrstve a potom moze prist situacia ked budes mat dve vrstvy a ta druha o tomto pravidle nemusi vediet ... tym ti vznikne nepekna diera v databaze s ktorou pravdepodobne nebude pocitat ani zvysok programu

samozrejme v ramci znovupouzitelnosti su vynimky medzi vrstvami vhodne (zalezi od kontextu) ... z toho v podstate vypliva ze ak chces pouzivat to okno pre zadavanie mena vo velkom tak by sa hodilo tam dat vynimku ... ale je pravdepodobne ze okno kde zadavas meno pouzijes maximalne parkrat ale s vynimkou si spravis vela problemov (viem si predstavit system ktory sa snazi vsetko vypisovat alebo ked budes debugovat cely system tak ti tam budu spamovat taketo vynimky) pre uplne beznu situaciu (stlacenie cancel) ktoru pravdepodobne budes riesit hned 

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
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, 40 hostů

Podobná vlákna

JOptionPane — založil Bladito

JOptionPane — založil Twissel

Výnimky. Kedy a prečo? — založil thomas

Zachytenie príkazu — založil zonda

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ý