[ Stijak @ 25.10.2011. 15:07 ] @
Rešavao sam neki početnički problem iz oracle java turorijala - drugi problem na http://download.oracle.com/jav...ential/io/QandE/questions.html

Prvi problem na koji sam naišao je da mi eclipse (Helios - instalirao sam stariju verziju zbog dodatka za android) nije prepoznavao try with resource statement kao što je u rešenju na http://download.oracle.com/jav...ssential/io/QandE/FindInt.java tj. prijavljivao expected { found (... Pretpostavio sam da je to zato što je Eclipse malo stariji ne razume Try with resources koji je valda novi u 1.7, pa sam na silu pokrenuo - izabrao proceed u Eclipse i java mi je prijavila istu grešku...

1. Prvo pitanje - Šta je pogrešno sa try with resources na http://download.oracle.com/jav...ssential/io/QandE/FindInt.java ? Devinitivno imam java JDK 1.7 instaliranu i podešenu u Eclipse jer sam bez problema radio već sa nekim klasama java.nio paketa koji je novi u javi 1.7...

Posle toga sam odlučio da odustanem od try with resources i riješim na stari način - preko finally bloka - kao u kopiranom kodu (ime klase ne odgovara problemu jer nisam htio praviti novi projekat samo za ovaj zadačić) - i sad mi u finally bloku prijavljuje grešku da mi je promjenljiva fc nedefinisana (a definisana je u try bloku)? Ne razimijem? Zar nije poenta finally bloka da počisti poslije try bloka i onda mi je logično da sve što je definisano u try - pa makar tu bilo i lokalno da je definisano i u finally?


2. Šta je problem sa mojom nedefinisanom fc promjenljivom u finally bloku? Ako ne mogu koristiti lokalne promjenljive iz try bloka - kako onda drugačije da zatvorim fc preko finally bloka?


Napomena - uspio sam pokrenuti program kada sam ovaj blok iz finally pomjerio u try (nisam mogao kopirati ni u catch blok jer mi je prijavljivao isti problem)...

Code:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.*;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.*;

class CountLetters {

    private Path file;
    CountLetters (Path file)
    {
        this.file = file;
    }
    public int seek() throws IOException
    {
        int lookingFor = -1;
        try
        {
                SeekableByteChannel fc = Files.newByteChannel(file);
                ByteBuffer buf = ByteBuffer.allocate(8);

                //Get the offset into the file.
                fc.read(buf);
                long offset = buf.getLong(0);

                //Seek to the offset location.
                fc.position(offset);
                buf.rewind();

                //Read the 'secret' value.
                fc.read(buf);
                lookingFor = buf.getInt(0);
        }
        catch (IOException x)
        {
        System.err.println(x);
        }
        finally
        {
            if (fc != null)
                fc.close();
        }
        return lookingFor;
    }
    
    public static void main(String[] args) throws IOException
    {
        Path file = Paths.get("datafile");
        int lookingFor = new CountLetters(file).seek();
        System.out.println("The value is " + lookingFor);
    }

}
[ ArsicS @ 26.10.2011. 07:50 ] @
Pogledaj u Window->Preferences->Java->Compiler, mislim da na Heliosu ne možeš da postaviš Compiler level 1.7
[ Java Beograd @ 26.10.2011. 08:01 ] @
Citat:
Šta je problem sa mojom nedefinisanom fc promjenljivom u finally bloku? Ako ne mogu koristiti lokalne promjenljive iz try bloka - kako onda drugačije da zatvorim fc preko finally bloka?
Deklariši promenljivu pre try bloka, tako da joj scope bude na nivou funkcije, a ne bloka.
[ Stijak @ 26.10.2011. 11:02 ] @
Citat:
Pogledaj u Window->Preferences->Java->Compiler, mislim da na Heliosu ne možeš da postaviš Compiler level 1.7


Ne može - a treba mi helious zbog androida (google koji može stići tolike stvari ne može stići updatovati android na novi eclipse...), ali nema veze - vratiću se na netbeans za javu (ili ako mi se bude dalo da instališem novi eclipse za javu)...

Hvala vam obojici na odgovorima... @java - to sam izbjegavao jer mi je samo definisanje bio ovaj red koji je mogao izazvati IOException - nije mi palo na pamet da je pre toga mogu definisati instancu te klase vrijednosti null - što sam sada i uradio i funkcioniše... I dalje mi nije jasno zašto su arhitekte java jezika odabrale da try i final ne djele scope - ali dobro...
[ :o) @ 26.10.2011. 11:17 ] @
Ovako sam ja to shvatio:
Scope u try bloku je problematičan zbog mogućnosti da se desi exception, kada se blok izvršavanja naredbi prekida i prelazi se na exception blok. Blok finally se svakako izvršava, bez obzira da li se exception desio ili ne. Iz ovoga se može zaključiti da, ako pokušaš da definišeš objekat u try bloku, njegovo kreiranje nije sasvim sigurno (zbog moguće pojave exception-a).
[ Java Beograd @ 28.10.2011. 08:21 ] @
Citat:
Stijak: I dalje mi nije jasno zašto su arhitekte java jezika odabrale da try i final ne djele scope - ali dobro...
Je ne vidim ni jedan razlog da dele scope ? Čemu to ? Šta ako baš želim da imam dve promenljive koje se isto zovu svaka u svom delu ?
[ Stijak @ 28.10.2011. 12:44 ] @
Kao što sam rekao jedina poenta finally bloka je da čisti za try blokom... Ali :o) je fino objasnio zašto je moje očekivanje bilo pogrešno :)