» »

Java try, catch blok

Java try, catch blok

marjan_h ::

Mene zanima zakaj ne vidi objekta skener, če ga dam v try blok?
Četudi dam skener.close() v blok finally ga še vedno ne vidi.





import java.io.File;
import java.util.Scanner;


public class OdpriDatoteko {
    public static void main(String args[]){
        try{
            Scanner skener = new Scanner(new File("podatki.txt"));
        }
        catch (Exception e){
            System.err.println("Datoteka ne obstaja!");
        }
        
        //Zakaj ne vidi skenerja?
        skener.close();
    }
}

Arto ::

Ker ga narediš samo če rata try. Se pravi ni nujno da sploh obstaja.

marjan_h ::

Potem moram branje, izpisovanje in zapiranje datoteke opraviti, v try bloku?

kunigunda ::

public class OdpriDatoteko {
    public static void main(String args[]){
        Scanner skener = null ;
        try{
            skener = new Scanner(new File("podatki.txt"));
        }
        catch (Exception e){
            System.err.println("Datoteka ne obstaja!");
        }
         
        //Zdej bo vidu
        if (skener != null) {
           skener.close();
        }
    }
}


ali pa

public class OdpriDatoteko {
    public static void main(String args[]){
        try{
            Scanner skener = new Scanner(new File("podatki.txt"));
            skener.close() ;
        }
        catch (Exception e){
            System.err.println("Datoteka ne obstaja!");
        }
         
    }
}

Zgodovina sprememb…

  • spremenil: Mavrik ()

marjan_h ::

Aha, dobro hvala za odgovore.

KaRkY ::

Če uporabljaš java 7 lahko tudi uporabiš
public class OdpriDatoteko {
    public static void main(String args[]){
        try(Scanner skener = new Scanner(new File("podatki.txt"))){
            //delaš z datoteko
        }
        catch (Exception e){
            System.err.println("Datoteka ne obstaja!");
        }
    }
}


To bo avtomatsko zaprlo scanner.
When you look long into an abyss, the abyss looks into you

Spura ::

Ce nimas Jave 7 za zgornji konstrukt, je pravilno:
Scanner skener = null;
try {
    Scanner skener = new Scanner(new File("podatki.txt"));
} catch (Exception e) {
    System.err.println("Datoteka ne obstaja!");
} finally {
    if (skener != null) skener.close();
}

Koda od kanigunde bo sicer delala v tem primeru, samo to te ugrizne v rit ko bos imel bolj kompleksno kodo.
Pravilna praksa je da dajes take stvari v finally blok.

kunigunda ::

Res je, sicer stvar navade, jest finally ne uporabljam ker sm dokej striktn pr cleanupu :)
Baje pa da Java7 clo sama popuca kar se v try bloku kreira (jest sm se na 6)

Spura ::

To, da si dost striken pri cleanupu nima veze, ker se ne gre za to. V tem primeru imas (kvazi) catch-all in nimas problemov.
Recimo pa, da imas catch (IOException), v bloku se zgodi NullPointerException. V tem primeru tvoja varianta ne dela, ker se bo tvoj
if (skener != null) skener.close(); ki sledi bloku gladko preskocil in si v riti.
Zato se uporablja finally blok, ker finally blok se izvede ne glede na to, ali catch ujame ta tip exceptiona ali ne.
Poleg tega se finally blok izvede tudi ce se kontrola prenese izven try bloka zaradi break, continue in return stavkov.
To ti dovoljuje pisanje bolj zanesljive in lazje razumljive kode.
Recimo:
SqlSession sess = null;
try {
    sess = SqlSessionFactory.openSession();
    return sess.doSelect(...);
} catch (SqlException e) {
    log.error(e.getMessage);
} finally {
    if (sess != null) {
        try {
            sess.close();
        } catch (SqlException e) {
            log.error(e.getMessage);
        }
    }
}


Java 7 popuca kar odpres v glavi try bloka, ne pa kar vse, kar se odpre v bloku.

Zgodovina sprememb…

  • spremenil: Spura ()

kunigunda ::

V catchu imam vedno nove try-e

kunigunda ::

Stvar navade, 20let nazaj ni blo exceptionov pa smo vse na roko krmilil, navada je zelezna srajca :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Java Objekti

Oddelek: Programiranje
102231 (1925) Mavrik
»

JAVA neujemanje tipov

Oddelek: Programiranje
151979 (1612) l0g1t3ch
»

[JAVA] mysql-connector-java in povezava z Mysql

Oddelek: Programiranje
92011 (1893) Sergio
»

[java] Runtime.exec()

Oddelek: Programiranje
111873 (1746) borchi
»

Kako pošiljanje datotek v JAVI.

Oddelek: Programiranje
141827 (1698) kopernik

Več podobnih tem