web-dev-qa-db-ja.com

プログラムで「キャッチまたはスローされると宣言する必要がある」のはなぜですか?

私はかなり前からこのプログラムに取り組んでいて、私の脳は揚げられています。探している人の助けを借りることができます。

テキストファイルを1行ずつ読み取るプログラムを作成しようとしています。各行は、各トークンにアクセスできるようにArrayListになっています。私は何が間違っているのですか?

import Java.util.*;
import Java.util.ArrayList;
import Java.io.*;
import Java.rmi.server.UID;
import Java.util.concurrent.atomic.AtomicInteger;

public class PCB {
    public void read (String [] args) {
        BufferedReader inputStream = null;

        try {
            inputStream = new BufferedReader(new FileReader("processes1.txt"));

            String l;
            while ((l = inputStream.readLine()) != null) {
                write(l);
            }
        }
        finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    public void write(String table) {
        char status;
        String name;
        int priority;

        ArrayList<String> tokens = new ArrayList<String>();

        Scanner tokenize = new Scanner(table);
        while (tokenize.hasNext()) {
            tokens.add(tokenize.next());
        }

        status = 'n';
        name = tokens.get(0);
        String priString = tokens.get(1);
        priority = Integer.parseInt(priString);

        AtomicInteger count = new AtomicInteger(0);
        count.incrementAndGet();
        int pid = count.get();

        System.out.println("PID: " + pid);
    }
}

眼球を突き出そうとしています。 3つのエラーが発生しました:

U:\Senior Year\CS451- Operating Systems\Project1 PCB\PCB.Java:24: unreported exception Java.io.IOException; must be caught or declared to be thrown
            inputStream.close();}
                             ^
U:\Senior Year\CS451- Operating Systems\Project1 PCB\PCB.Java:15: unreported exception Java.io.FileNotFoundException; must be caught or declared to be thrown
        inputStream = new BufferedReader(new FileReader("processes1.txt"));
                                         ^
U:\Senior Year\CS451- Operating Systems\Project1 PCB\PCB.Java:18: unreported exception Java.io.IOException; must be caught or declared to be thrown
        while ((l = inputStream.readLine()) != null) {
                                        ^

私は何が間違っているのですか?

9
Luron

JavaでI/Oを操作する場合、ほとんどの場合、IOExceptionを処理する必要があります。これは、ストリームの読み取り/書き込みまたはクローズのときに発生する可能性があります。

機密ブロックをtry // catchブロックに配置し、ここで例外を処理する必要があります。

例えば:

try{
    // All your I/O operations
}
catch(IOException ioe){
    //Handle exception here, most of the time you will just log it.
}

リソース:

15
Colin Hebert

Javaは、コンパイル時に例外仕様をチェックします。例外をキャッチするか、メソッドシグネチャでスローされることを宣言する必要があります。メソッドからスローされる可能性があることを宣言する方法は次のとおりです。

   public void read (String [] args) throws Java.io.IOException {

メソッドがそれに応じて何かを行う必要がある場合は、例外をキャッチします。発信者が失敗について知る必要がある場合は、スローされたものとして宣言します。

これらは相互に排他的ではありません。例外をキャッチし、何かを実行して、例外または元の例外をラップする新しい例外(「原因」)を再スローすると便利な場合があります。

RuntimeExceptionとそのサブクラスを宣言する必要はありません。

8
Andy Thomas

あなたはむしろすることができます

try{
    // All your I/O operations
}
catch(Exception e){
    //Handle exception here, most of the time you will just log it.
}

一般に、クラス自体をキャッチすることは悪い考えではなく、非常に具体的なログが必要な場合は、ロジックをキャッチするか、instanceofを実行するかを決定します。

0
Pravin

優れたIDEは、catchブロックを作成するか、メソッド宣言に例外を追加します。

Colinのソリューションに従ってメソッド宣言に例外を追加する場合、メソッドを呼び出すメソッドにも適切なcatchブロックを含めるか、メソッド宣言で例外を宣言する必要があることに注意してください。

0
Tony Ennis