Jak ukončit if bez returnu – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak ukončit if bez returnu – Java – Fórum – Programujte.comJak ukončit if bez returnu – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Draffix0
Duch
25. 7. 2011   #1
-
0
-

Zdravím, mám opět jeden dotaz. Mám metodu, ve které mám podmínku a kterou monitoruji jako výjimku pomocí try. Pozitivní podmínka, respektive výjimka, má vyhodit hlášku, že program neumí počítat komplexní čísla a tím bych chtěl program ukončit. Jenže program jede dál a pokračuje na další dvě metody a snaží se i přesto vypočítat to. Proto jsem se chtěl zeptat, zda existuje nějaký příkaz pro if, aby když je pravda aby už nepokračoval. Avšak return použít nechci, protože metoda obsahuje jenom if a nic nevrací, proto chci použít void. Raději uvedu celý program. Díky za pomoc.

package VypocetKvadratickeRovnice;
import java.lang.Math.*;
class ZapornyDiskriminant extends Exception {
    @Override
    public String toString(){
        return "Program neumí počítat s komplexními čísly";
    }
}
public class VypocetKvadratickeRovnice {
    public static void main(String[] args) {
        double hodnoty[]={3,-9,13};
        double diskriminant = vypocetDiskriminantu(hodnoty);
        try {
        podminkaZdaJeZaporny(diskriminant);
                }
        catch (ZapornyDiskriminant v) {
            System.out.println("Chyba: " + v);
        }
        double odmocninaDisktriminantu = Math. sqrt(diskriminant);
        double[] vysledek = vysledek(odmocninaDisktriminantu, hodnoty);
    }

    static double vypocetDiskriminantu(double cisla[])
    {
        return (cisla[1]*cisla[1]-4*cisla[0]*cisla[2]);
    }

    static void podminkaZdaJeZaporny(double diskriminant) throws ZapornyDiskriminant
    {
        if(diskriminant<0)
        {
            throw new ZapornyDiskriminant();
        }
    }

    static double [] vysledek(double odmocninaDisktriminantu, double hodnoty[])
    {
        double x1 = (((-1) * hodnoty[1] + odmocninaDisktriminantu) / (2 * hodnoty[0]));
        double x2 = (((-1) * hodnoty[1] - odmocninaDisktriminantu) / (2 * hodnoty[0]));

        System.out.println("Výsledný kořen x1 je " + x1);
        System.out.println("Výsledný kořen x2 je " + x2);

        double [] vysledek = {x1, x2};

        return vysledek;
    }
}
Nahlásit jako SPAM
IP: 89.29.102.–
Učit se, učit se, učit se... V. I. Lenin
D-Fox0
Stálý člen
25. 7. 2011   #2
-
0
-

#1 Draffix

Staci akorad do 'catch' bloku pridat prikaz pro ukonceni programu.

catch (ZapornyDiskriminant v) {
   System.out.println("Chyba: " + v);
   System.exit(1);
}
Nahlásit jako SPAM
IP: 86.49.71.–
26. 7. 2011   #3
-
0
-

Troufám si tvrdit, že je ta část špatně. Výjimky slouží k ošetření výjimečných situací a ne k ošetření vstupů. Měla by tam být jen podmínka.

Není možné použít return; i přesto, že metoda nic nevrací?

Nahlásit jako SPAM
IP: 91.217.52.–
Dušan Janošík | web: djanosik.cz, @djanosik
D-Fox0
Stálý člen
26. 7. 2011   #4
-
0
-

#3 djanosik
Tak v Jave se vyjimky na osetreni vstupu pouzivaji bezne :). V tomto pripade by bylo ale lepsi pouzit 'unchecked exception' (IllegalArgumentException) ~ bud primo nebo dedenim.

Me se teda pouziti vyjimky jevi celkem logicke. Urcite lepsi nez treba returnovat hodnotu -1 nebo null... to mi pripada jako antipattern. Neco podobne jako vracet 'null' misto prazdeho 'List'u.

Nahlásit jako SPAM
IP: 86.49.71.–
Řešení
26. 7. 2011   #5
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#4 D-Fox
Jistě, použití *ArgumentException je zcela v pořádku, ale v jiné situaci. Např. když má parametr metody nevyhovující hodnotu a nevím jak ji zpracovat. Tady ovšem používá výjimku jen proto, aby ji následně zahodil a zobrazil chybovou zprávu.

To je podle mě zralé na refaktoring. Proč to neudělat takhle?

public static void main(String[] args) {
    double hodnoty[] = {3, -9, 13};
    double diskriminant = vypocetDiskriminantu(hodnoty);

    if(diskriminant >= 0) {
        double odmocninaDisktriminantu = Math. sqrt(diskriminant);
        double[] vysledek = vysledek(odmocninaDisktriminantu, hodnoty);
    }
    else {
        System.out.println("Chyba: Program neumí počítat s komplexními čísly.");
        return; // return jen v případě, že za blokem else následuje další kód    

        // nebo: throw new ZapornyDiskriminant();
    }
}

Nevím, jestli to takhle v Javě může fungovat, ale IMHO je to čistší řešení. Podobnou věc jsem zkoušel rozmluvit učiteli na VŠ, ale bez úspěchu. Postupy v C# a Javě se asi v tomhle odlišují.

Nahlásit jako SPAM
IP: 91.217.52.–
Dušan Janošík | web: djanosik.cz, @djanosik
D-Fox0
Stálý člen
26. 7. 2011   #6
-
+2
-
Zajímavé

#5 djanosik
S tim souhlasim, ono pouzivat metodu jen na kontrolu zaporne hodnoty je zde celkem k nicemu. Me slo jen obecne o to, ze se vyjimky bezne na osetreni vstupu metod pouzivaji. V tomhle pripade je to samozrejme celkem volovina. Kdyz by ale Draffix chtel preci jenom tu kontrolu nechat v metode, tak urcite nepouzit vyjimku ale:

static boolean podminkaZdaJeZaporny(double diskriminant) {
  return diskriminant < 0;
}
Nahlásit jako SPAM
IP: 86.49.71.–
Draffix0
Duch
26. 7. 2011   #7
-
0
-

Tak ono je to teprve spíše takový nástřel, jednou bych chtěl i dodělat ty komplexní čísla, ale mé vědomosti v matematice jsou celkem bídné a tak to nechávám na jindy a proto metodu nechávám kratší, třeba do ní ještě něco přijde. Kód djanosika je "čistší", ale přijde mi to spíše jako estetická úprava s vynecháním výjimky. Na jiném fóru mi poradili, že se mám pokud možno podmínkám vyhnout a využít výjimku. Předtím jsem měl obdobný kód:

static int vypocet(int diskriminant)
{ 
if(diskriminant<0) 
{ 
System.out.println("Vyšlo komplexní číslo"); 
return diskriminant; 
} 

A moc jsem úspěch nesklidil. Ale tak to je jedno. Když si několikrát prohlédl kód djanosika, tak se mi zdá asi nejlepší volbou, když přihlédnu i k tomu, že ubyde jedna metoda a výjimka a kód se "zprůhlední" a zjednodušší. Asi sem jen chtěl za každou cenu využít výjimky. Každopádně děkuji, moc mi to pomohlo.

Nahlásit jako SPAM
IP: 89.29.102.–
Učit se, učit se, učit se... V. I. Lenin
26. 7. 2011   #8
-
0
-

#7 Draffix
Právě to vynechání výjimky je dost podstatné, protože ty mají, pokud vím, velkou režii a tady to je vyloženě zbytečné.

Nahlásit jako SPAM
IP: 91.217.52.–
Dušan Janošík | web: djanosik.cz, @djanosik
aleStefan
~ Anonymní uživatel
4 příspěvky
4. 8. 2011   #9
-
0
-

   

public double[] kvadRovnica(double[] koef){
	double[] res = double[4];
	double disc = koef[1]*koef[1]-4*koef[0]*koef[2];
	
	for(int i=0; i<4;i++){
		res[i]=Math.signum(-i+1.5f)*sqrtOrZero(Math.signum(-(i%2)+0.5)*disc);
		res[i]=i<2?koef[1]/(2*koef[0]):0;
	}
	return res;
}

public double sqrtOrZero(double x){
	if(x<=0)return 0;
	return Math.sqrt(x);
}

A co takto to neosetrovat, ale iba vypocitat. To je tiez moznost.

Nahlásit jako SPAM
IP: 213.215.67.–
aleStefan
~ Anonymní uživatel
4 příspěvky
4. 8. 2011   #10
-
0
-

#9 aleStefan
Pardon pomylil som sa.V siedmom riadku ma byt minus. Inak by to bolo x=+b/2a+-sqrt....

Nahlásit jako SPAM
IP: 213.215.67.–
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, 44 hostů

Podobná vlákna

Vlákna, jak je ukončit — založil Kartmen

Jak ukončit jinou aplikaci — založil Hula

[Java6]Jak ukoncit thread? — založil shadius

Moderátoři diskuze

 

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