Bug v Javě =D – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Bug v Javě =D – Java – Fórum – Programujte.comBug v Javě =D – Java – Fórum – Programujte.com

 

ingiraxo+15
Grafoman
12. 11. 2013   #1
-
0
-

Zdravim,

zajímalo by mě, co řeknete na tento kus kódu. 

Otázka... co si myslíte, že nastane? Nebo co by logicky mělo nastat :-)

public class Test
{
    public static void main(String[] args)
    {
        int value = getValue();
        System.out.println(value);
    }

    private static int getValue()
    {
        try
        {
            throw new Exception();
        }
        finally
        {
            return 1;
        }
    }
}

Úplně z nepochopitelných důvodů se Java rozhodne, že moji vyjímku úplně spolkne a vypíše hodnotu 1. Zajímavé že? A to mám JRE 1.7

Nahlásit jako SPAM
IP: 213.192.1.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Matrix17
~ Anonymní uživatel
300 příspěvků
12. 11. 2013   #2
-
0
-

Blok finaly se vykoná vždycky. Tj. vyhodí to vyjímku, tu si "ošetří" rovnou v try a pak to pokračuje dál do finaly kde to vrátí 1. Aby se stalo něco jinýho musel bys tam dát catche a vyjímku si odchytnout (vrátit něco jinýho). Je to naprosto normální chování.

Nahlásit jako SPAM
IP: 83.240.17.–
ingiraxo+15
Grafoman
12. 11. 2013   #3
-
0
-

#2 Matrix17
no jo, ale já v Try vyhazuju vyjímku, nikoli zachytávám.. správně by to mělo vypsat chybu a né jí celou ztopit

pokud např. ta metoda nebude vracet hodnotu (bude void), tak to vyhodí vyjímku tak, jak se očekává, ale pokud vrací něco, tak dělá že se nic nestalo

Nahlásit jako SPAM
IP: 213.192.1.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
z
~ Anonymní uživatel
268 příspěvků
12. 11. 2013   #4
-
0
-

Pravděpodobně to spadá pod toto:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

14.20.2. Execution of try-finally and try-catch-finally

A try statement with a finally block is executed by first executing the try block. Then there is a choice:
    - If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:
        - If the run-time type of V is not assignment compatible with a catchable exception class of any catch clause of the try statement, then the finally block is executed. Then there is a choice:
            - If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten).

Nahlásit jako SPAM
IP: 88.101.8.–
Matrix17
~ Anonymní uživatel
300 příspěvků
12. 11. 2013   #5
-
0
-

Taky vychazuješ vyjímku, která čeká na catche, ty ho tam nemáš, tak to de na finaly. Fakt nevím s čím máš pořád problém. Zkusil sem i to. že metoda je void a překvapivě se to chová naprosto stejně.

Nahlásit jako SPAM
IP: 83.240.17.–
ingiraxo+15
Grafoman
12. 11. 2013   #6
-
0
-

#5 Matrix17
dobře, ale jak je možný, že díky return skryju chybu?

    public static void test()
    {
        try
        {
            throw new IllegalArgumentException();
        }
        finally
        {
            System.out.println("ERROR"); // vypise vzdy
            // pokud dam pryc return, tak nastane vyjimka,
            // kterou ocekavam, pokud tam necham return,
            // tak to vyjimku skryje a nic se nestane
            return;
        }
    }
Nahlásit jako SPAM
IP: 213.192.1.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Matrix17
~ Anonymní uživatel
300 příspěvků
12. 11. 2013   #7
-
0
-
Nahlásit jako SPAM
IP: 83.240.17.–
vitamin+8
Grafoman
12. 11. 2013   #8
-
0
-

#6 ingiraxo
Ak je return v bloku finally tak bud budes ignorovat return a budes pokracovat v spracovavani vynimky, alebo budes ignorovat vynimku a vratis sa z funkcie pomocou returnu. Tvorcovia javy si zvolily 2 sposob. V C#, D a urcite aj v inych jazykoch to spravyli lepsie a return vo finally sa vobec neprelozi. Niektore IDE vypisuju aj pri jave warningy

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
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, 9 hostů

Podobná vlákna

Bug? — založil 7raul

C bug — založil pr0gr4mm3r

IE bug — založil Marty_SVK

Divnej bug IE — založil Phoenix

Malej bug — založil Phoenix

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ý