Pusty return w try-catch

0

Cześć. Jestem na 1 roku, próbuję się douczać Javy samodzielnie przy pomocy książek. Mam takie pytanie co do użycia słowa kluczowero return w try-catch. Próbuję otwierać plik,

         int i;
        FileInputStream fileInputStream;
        if (args.length != 1){
            System.out.println("Sposób użycia: ShowFile nazwa-pliku");
            return;
        }

        //otwarcie pliku:
        try {
            fileInputStream = new FileInputStream(args[0]);
        } catch (FileNotFoundException e) {
            System.out.println("Nie mozna otworzyć pliku");
            e.printStackTrace();
            return; // O TO MI CHODZI
        }

I jest wszystko OK. Jednak jeżeli usunę to ostatnie return, to następna instrukcja rzuca mi błąd, że fileInputStream nie zostało nigdzie zainicjowane:

         try {
            do {
                i = fileInputStream.read(); // tutaj się wywala
                if (i != -1)
                    System.out.println((char) i);
            } while (i != -1);
        } catch (IOException e) {
            System.out.println("Błąd odczytu pliku");
            e.printStackTrace();
        }

W związku z tym pytania:

  1. Dlaczego tak się dzieje?
  2. Czy są inne sytuacje, kiedy używa się return bez zwracanej wartości?
0
  1. w wersji nr 1 zmienna fileInputStream może mieć nieokreśloną wartość za try, dlatego zamiast:
FileInputStream fileInputStream;

daj:

FileInputStream fileInputStream = null;
  1. tylko i wyłącznie wtedy gdy metoda w której znajduje się kod ma typ zwracanej wartości = void
0

Hmm, z grubsza rozumiem. Jednak co tutaj 'robi' to return, ze bez niego program w pierwszej wersji sie nie kompiluje?

0

Gdy masz return w catch, to w przypadku braku inicjalizacji wyskakujesz z metody i nic dalej się nie wykona. Czyli nie skorzystasz z niezainicjowanej fileInputStream i wszystko OK.

Gdy go nie masz, to:

        FileInputStream fileInputStream;

        try {
            new FileInputStream(args[0]); // #1
            fileInputStream = {1}; // #2
        } catch (FileNotFoundException e) {
            System.out.println("Nie mozna otworzyć pliku");
            e.printStackTrace();
        }
 
        // #3: tutaj chcesz skorzystać z fileInputStream

a) program może wygenerować wyjątek w linii #1
b) wtedy w linii #2, nie wykona się przypisanie wartości z pkt #1 do zmiennej fileInputStream
c) i korzystanie w linii #3 z fileInputStream jest zabronione - zmienna niezainicjowana ze względu na (b)

0

Wszystko jasne, dzięki serdeczne za pomoc i poświęcony czas ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1