1

私はコードを持っています:

public class RssReader {
    private File dataFile = new File("data.dat");
    private  FileInputStream dataStream = new FileInputStream("data.dat");
    boolean fileExists;

    public static void main(String[] args) {
    }
}

私の質問は、FileInputStream または Try/catch をグローバル関数として必要とするコードを配置できますか?

4

4 に答える 4

3

はい、できます。メソッドが任意の種類の をmainスローすることを宣言できます。Exception

public static void main(String[] args) throws IOException {
}

また、コード内の try-catch ブロックを省略できます。

ただし、そうしないことを強くお勧めします。まず、try-catch ブロックが存在するのには理由があります。これらは、予見できても制御できない例外 (つまり、不適切なファイル形式) をキャッチするために存在します。finally次に、例外が発生した場合でも、ストリームをブロック単位で閉じることができます。

于 2013-06-14T15:49:42.780 に答える
0

throws Exception でメソッドに署名することにより、そのコードを追加できます。ただし、ストリーム リーダーなどを使用している場合は、ストリームを閉じたり、ライターをフラッシュしたりする必要があることが多いため、お勧めできません。

ストリーム オブジェクトを開いたり閉じたりする必要がある場合は、それについて考える必要があると思います。

于 2013-06-14T16:01:26.437 に答える
0

できることとできないことがいくつかあります。

  1. チェック例外をスローできるコードで変数を初期化することはできません。コンパイラは文句を言います。したがって、あなたの行頭private FileInputStream ...は違法です。

  2. main()静的メソッド内でインスタンス変数を使用することはできません。を入れると、コンパイラは再び文句を言い... dataStream ...ますmain()

  3. throws IOExceptionmain メソッドに 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 は、失敗した場合の対処方法も決定します。

変更は、致命的な例外をキャッチすることを除いて、すべてをインスタンス スコープに移動し、静的スコープから外します。読みやすいように、変数を一番上に置いておくことができます。作業を行うメソッドには、それが何を行うかを説明する名前が付けられます。

于 2013-06-14T16:10:36.743 に答える