Zmienne składowe a wyjątki

0

Witam
W klasie zadeklarowałem jako zmienną składową referencje do obiektu typu FileWriter. Sam obiekt do tej referencji stworzyłem w konstruktorze i działało poprawnie tak samo w wersji z blokiem try{} umieszczonym w konstruktorze jak i po dopisaniu throws IOException do deklaracji konstruktora i obsługą wyjątku gdzie indziej. Problem pojawił się kiedy próbowałem od razu przy deklaracji zmiennej składowej przypisać do niej obiekt.
Tak jak tutaj:

class Plik{
FileWriter pliczek=new FileWriter("text.txt"); //deklaracja obiektu jako zmienna składowa-Konstruktor klasy FileWriter generuje wyjątek.

Plik(){   //konstruktor
....}

W jaki sposób w takiej sytuacji obsługiwać wyjątki? Próbowałem ująć to w blok try{}, ale niestety program się nie skompilował, pomyślałem też o przekazaniu wyżej przy pomocy klauzuli throws, tylko gdzie by można było ją dopisać?Czy może w jakiś sposób przekazać to konstruktorowi domyślnemu?

0

edit: patrz post kolegi Koziołka :)

0

To na to wychodzi, że klasy których konstruktory generują wyjątki, mają ograniczone zastosowanie bo na przykład ich obiekty nie mogą być zmiennymi static?Dobrze to rozumuje?

0

Nie. Statyczne pola klasy można inicjalizować w bloku static

class A{
  private static Integer x;
  static{
    x=new Integer(1);
  }
}
0

@Shalom, poza blokiem static masz też inicjalizatory:

package tt;

import java.io.FileWriter;
import java.io.IOException;

public class Main2 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("main");
        Main2 main2 = new Main2();
        System.out.println("main");
    }

    {
        try {
            System.out.println("co się stanie");
            fw = new FileWriter("");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    FileWriter fw ;
    public Main2() {
        System.out.println("konstruktor");
    }

}
0

@Koziołek, czy w twoim programie fw jest normalną zmienną składową, czy są jakieś różnice od tych utworzonych poza inicjalizatorem, np w zasięgu?
Druga sprawa to taka że twój program przestał działać gdy dopisałem do deklaracji fw static, czy w inicjalizatorze można takie zmienne tworzyć?

0

@SirSparrow, jeżeli do incjalizatora dodasz static to zaczyna obowiązywać "magia" związana z polami statycznymi. W poprawionej wersji kodu oznacza to, że nie możesz dostać się do pola fw, które jest zwyczajnym polem ponieważ w trakcie wywołania statycznego nie masz do dyspozycji żadnego obiektu do którego możesz się odnieść.

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