できることとできないことがいくつかあります。
チェック例外をスローできるコードで変数を初期化することはできません。コンパイラは文句を言います。したがって、あなたの行頭private FileInputStream ...
は違法です。
main()
静的メソッド内でインスタンス変数を使用することはできません。を入れると、コンパイラは再び文句を言い... dataStream ...
ますmain()
。
throws IOException
main メソッドに a を付けることができます。
これらに対処する1 つの方法は、次のようにすることです。
public class RssReader {
public static void main(String[] args) throws IOException {
File dataFile = new File("data.dat");
FileInputStream dataStream = new FileInputStream("data.dat");
boolean fileExists;
... use the variables here ...
}
}
プログラムを実行すると、たとえばファイルが存在しない場合、コマンド ラインに放り出されます。その場合、エラー メッセージとスタック トレースが出力されます。
そこで行ったことは、すべての変数をmain()
メソッドのスコープに移動することです。次に、メソッドに を追加しthrows
て、Java 呼び出しの基本部分がmain()
例外を処理できるようにしました。
または、次のような別の方法を実行することもできます。
public class RssReader {
private static File dataFile = new File("data.dat");
private static FileInputStream dataStream;
static {
try {
dataStream = new FileInputStream("data.dat");
} catch (IOException e) {
throw new RuntimeException(e); // this isn't a best practice
}
}
static boolean fileExists;
public static void main(String[] args) {
... use the variables here ...
}
}
ファイルの検索に問題がある場合は、同じことを行います。コマンド ラインに出力し、メッセージを出力します。
これにより、チェックされた可能性のある例外が静的イニシャライザ ブロック内に隠され、その周りに try-catch が配置されます。チェックされた例外は、チェックされていない例外に変わります。また、すべての変数を静的にするため、静的メソッドで使用できますmain()
さらに良い方法であるもう1つの可能な解決策:
public class RssReader {
private File dataFile = new File("data.dat");
private FileInputStream dataStream;
boolean fileExists;
public RssReader() throws IOException {
dataStream = new FileInputStream("data.dat");
}
public void doTheWork() {
... use all the variables here ...
}
public static void main(String[] args) {
try {
reader = new RssReader();
reader.doTheWork();
} catch (IOException e) {
System.out.printf("File 'data.dat' not found. Exiting ...");
}
}
}
私が一番好きなものです。例外が発生した場合に何が起こるかを制御できるため、情報メッセージを出力してプログラムが終了したことを伝えます。main()
すべての変数は、メソッドで作成されたオブジェクト インスタンス内のインスタンス変数です。Main はほとんど何もせず、インスタンスを作成して動作を開始するよう指示します。Main は、失敗した場合の対処方法も決定します。
変更は、致命的な例外をキャッチすることを除いて、すべてをインスタンス スコープに移動し、静的スコープから外します。読みやすいように、変数を一番上に置いておくことができます。作業を行うメソッドには、それが何を行うかを説明する名前が付けられます。