Javaの例外処理とファイル入出力 課題集 (全30問)

2025-08-03

初級問題 (9問)

例外処理基礎

  1. try-catch基本: ゼロ除算をtry-catchで処理するコードを作成してください。
  2. 複数catchブロック: 異なる種類の例外をキャッチする複数catchブロックの例を作成してください。
  3. finallyブロック: ファイル操作でfinallyブロックを使用してリソースを解放する例を作成してください。
  4. 例外情報取得: catchブロックで例外のメッセージとスタックトレースを出力してください。
  5. チェック例外処理: IOExceptionをスローするメソッドを呼び出すコードを作成してください。
  6. 非チェック例外: NullPointerExceptionが発生する可能性のあるコードを作成し、キャッチしてください。
  7. カスタム例外: 独自の例外クラスを定義してください。
  8. 例外の再スロー: 例外をキャッチして処理した後、再スローするコードを作成してください。
  9. 例外の連鎖: 例外を別の例外でラップしてスローするコードを作成してください。

中級問題 (15問)

ファイル入出力基礎

  1. ファイル読み込み: FileReaderを使用してテキストファイルを1行ずつ読み込んで表示してください。
  2. ファイル書き込み: FileWriterを使用してテキストファイルに文字列を書き込んでください。
  3. BufferedReaderの利用: BufferedReaderでファイルを効率的に読み込むコードを作成してください。
  4. ファイル存在確認: ファイルが存在するか確認するコードを作成してください。
  5. バイナリファイル読み込み: FileInputStreamでバイナリファイルを読み込むコードを作成してください。
  6. バイナリファイル書き込み: FileOutputStreamでバイナリデータをファイルに書き込むコードを作成してください。
  7. ファイルコピー: あるファイルを別のファイルにコピーするプログラムを作成してください。
  8. ディレクトリ作成: 新しいディレクトリを作成するコードを作成してください。
  9. ファイル削除: ファイルを削除するコードを作成してください。
  10. ファイル属性取得: ファイルのサイズと最終更新日時を取得するコードを作成してください。

例外処理応用

  1. try-with-resources: try-with-resources構文を使用してファイルリソースを自動解放するコードを作成してください。
  2. マルチキャッチ: Java7のマルチキャッチ機能を使用して複数例外を処理するコードを作成してください。
  3. 例外の抑制: try-with-resourcesで発生した例外とブロック内の例外の関係を確認するコードを作成してください。
  4. Optionalと例外: Optionalを使用して例外発生を回避するコード例を作成してください。
  5. アサーション: assertを使用して条件チェックを行うコードを作成してください。

上級問題 (6問)

  1. カスタム例外の活用: 業務ロジックでカスタム例外をスローし、適切に処理するコードを作成してください。
  2. NIOファイル操作: FilesクラスとPathクラスを使用してファイル操作を行うコードを作成してください。
  3. シリアライゼーション: オブジェクトをファイルにシリアライズ/デシリアライズするコードを作成してください。
  4. ロギングフレームワーク: 例外をログファイルに出力するコードを作成してください。
  5. トランザクション処理: ファイル操作で擬似トランザクションを実装するコードを作成してください。
  6. リソース管理ユーティリティ: リソース管理を行うユーティリティクラスを作成してください。

Javaの例外処理とファイル入出力 解答例

初級問題の解答

  1. try-catch基本
try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("ゼロ除算が発生しました");
}
  1. 複数catchブロック
try {
    int[] arr = new int[5];
    arr[10] = 50; // ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("配列範囲外アクセス");
} catch (Exception e) {
    System.out.println("その他の例外");
}
  1. finallyブロック
FileReader reader = null;
try {
    reader = new FileReader("file.txt");
    // ファイル操作...
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 例外情報取得
try {
    // 例外発生コード
} catch (Exception e) {
    System.out.println("エラーメッセージ: " + e.getMessage());
    e.printStackTrace();
}
  1. チェック例外処理
try {
    Files.readAllLines(Paths.get("nonexistent.txt"));
} catch (IOException e) {
    System.out.println("ファイル読み込みエラー");
}
  1. 非チェック例外
String str = null;
try {
    System.out.println(str.length());
} catch (NullPointerException e) {
    System.out.println("null参照エラー");
}
  1. 独自の例外クラス
class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}
  1. 例外の再スロー
try {
    // 処理...
} catch (IOException e) {
    System.out.println("エラー処理");
    throw e;
}
  1. 例外の連鎖
try {
    // 処理...
} catch (SQLException e) {
    throw new MyException("データベースエラー", e);
}

中級問題の解答

  1. ファイル読み込み
try (FileReader fr = new FileReader("input.txt");
     BufferedReader br = new BufferedReader(fr)) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. ファイル書き込み
try (FileWriter fw = new FileWriter("output.txt")) {
    fw.write("Hello, World!\n");
    fw.write("Javaファイル入出力\n");
} catch (IOException e) {
    e.printStackTrace();
}
  1. BufferedReaderの利用
try (BufferedReader br = new BufferedReader(new FileReader("largefile.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. ファイル存在確認
File file = new File("test.txt");
if (file.exists()) {
    System.out.println("ファイルが存在します");
} else {
    System.out.println("ファイルが存在しません");
}
  1. バイナリファイル読み込み
try (FileInputStream fis = new FileInputStream("image.jpg")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        // バイナリデータ処理...
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. バイナリファイル書き込み
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello"のバイト表現
try (FileOutputStream fos = new FileOutputStream("binary.dat")) {
    fos.write(data);
} catch (IOException e) {
    e.printStackTrace();
}
  1. ファイルコピー
try (InputStream is = new FileInputStream("source.txt");
     OutputStream os = new FileOutputStream("destination.txt")) {
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) > 0) {
        os.write(buffer, 0, length);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. ディレクトリ作成
File dir = new File("new_directory");
if (dir.mkdir()) {
    System.out.println("ディレクトリ作成成功");
} else {
    System.out.println("ディレクトリ作成失敗");
}
  1. ファイル削除
File file = new File("temp.txt");
if (file.delete()) {
    System.out.println("ファイル削除成功");
} else {
    System.out.println("ファイル削除失敗");
}
  1. ファイル属性取得
File file = new File("document.txt");
System.out.println("サイズ: " + file.length() + " bytes");
System.out.println("最終更新: " + new Date(file.lastModified()));
  1. try-with-resources
try (BufferedReader br = Files.newBufferedReader(Paths.get("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. マルチキャッチ
try {
    // 複数例外が発生する可能性のあるコード
} catch (IOException | SQLException e) {
    System.out.println("IOまたはSQLエラー: " + e.getMessage());
}
  1. 例外の抑制
try (InputStream is = new FileInputStream("file.txt")) {
    throw new IOException("ブロック内例外");
} catch (Exception e) {
    System.out.println("キャッチした例外: " + e.getMessage());
    for (Throwable t : e.getSuppressed()) {
        System.out.println("抑制された例外: " + t.getMessage());
    }
}
  1. Optionalと例外
Optional optional = Optional.ofNullable(getPossiblyNullString());
String result = optional.orElse("デフォルト値");
  1. アサーション
int value = 15;
assert value > 10 : "値が10以下です";
// VMオプションで-eaを指定する必要あり

上級問題の解答

  1. カスタム例外の活用
class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

class Account {
    private double balance;
    
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException("残高不足: " + balance);
        }
        balance -= amount;
    }
}

// 使用例
try {
    Account account = new Account();
    account.withdraw(1000);
} catch (InsufficientFundsException e) {
    System.out.println("エラー: " + e.getMessage());
}
  1. NIOファイル操作
Path path = Paths.get("example.txt");
try {
    // ファイル読み込み
    List lines = Files.readAllLines(path);
    
    // ファイル書き込み
    Files.write(path, Arrays.asList("Line1", "Line2"), 
              StandardOpenOption.CREATE);
    
    // ファイルコピー
    Files.copy(path, Paths.get("copy.txt"), 
              StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    e.printStackTrace();
}
  1. シリアライゼーション
class Person implements Serializable {
    private String name;
    private int age;
    // コンストラクタ、ゲッター等は省略
}

// シリアライズ
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("person.ser"))) {
    oos.writeObject(new Person("Alice", 25));
}

// デシリアライズ
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("person.ser"))) {
    Person p = (Person) ois.readObject();
    System.out.println(p.getName());
}
  1. ロギングフレームワーク
import java.util.logging.*;

Logger logger = Logger.getLogger("MyLogger");

try {
    // ファイルハンドラの設定
    FileHandler fh = new FileHandler("app.log");
    logger.addHandler(fh);
    SimpleFormatter formatter = new SimpleFormatter();
    fh.setFormatter(formatter);
    
    // 例外をログに記録
    int result = 10 / 0;
} catch (Exception e) {
    logger.log(Level.SEVERE, "例外が発生しました", e);
}
  1. トランザクション処理
class FileTransaction {
    public static void backupAndWrite(Path file, List lines) throws IOException {
        Path backup = Paths.get(file.toString() + ".bak");
        Files.copy(file, backup, StandardCopyOption.REPLACE_EXISTING);
        
        try {
            Files.write(file, lines, StandardOpenOption.TRUNCATE_EXISTING);
        } catch (IOException e) {
            // 失敗したらバックアップから復元
            Files.copy(backup, file, StandardCopyOption.REPLACE_EXISTING);
            throw e;
        }
    }
}
  1. リソース管理ユーティリティ
class ResourceManager {
    public static void withFileReader(String filename, Consumer action) {
        try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
            action.accept(br);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
    
    public static void withFileWriter(String filename, Consumer action) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) {
            action.accept(bw);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
}

// 使用例
ResourceManager.withFileReader("input.txt", reader -> {
    // リーダーを使用した処理
});