初級問題 (9問)
例外処理基礎
- try-catch基本: ゼロ除算をtry-catchで処理するコードを作成してください。
- 複数catchブロック: 異なる種類の例外をキャッチする複数catchブロックの例を作成してください。
- finallyブロック: ファイル操作でfinallyブロックを使用してリソースを解放する例を作成してください。
- 例外情報取得: catchブロックで例外のメッセージとスタックトレースを出力してください。
- チェック例外処理: IOExceptionをスローするメソッドを呼び出すコードを作成してください。
- 非チェック例外: NullPointerExceptionが発生する可能性のあるコードを作成し、キャッチしてください。
- カスタム例外: 独自の例外クラスを定義してください。
- 例外の再スロー: 例外をキャッチして処理した後、再スローするコードを作成してください。
- 例外の連鎖: 例外を別の例外でラップしてスローするコードを作成してください。
中級問題 (15問)
ファイル入出力基礎
- ファイル読み込み: FileReaderを使用してテキストファイルを1行ずつ読み込んで表示してください。
- ファイル書き込み: FileWriterを使用してテキストファイルに文字列を書き込んでください。
- BufferedReaderの利用: BufferedReaderでファイルを効率的に読み込むコードを作成してください。
- ファイル存在確認: ファイルが存在するか確認するコードを作成してください。
- バイナリファイル読み込み: FileInputStreamでバイナリファイルを読み込むコードを作成してください。
- バイナリファイル書き込み: FileOutputStreamでバイナリデータをファイルに書き込むコードを作成してください。
- ファイルコピー: あるファイルを別のファイルにコピーするプログラムを作成してください。
- ディレクトリ作成: 新しいディレクトリを作成するコードを作成してください。
- ファイル削除: ファイルを削除するコードを作成してください。
- ファイル属性取得: ファイルのサイズと最終更新日時を取得するコードを作成してください。
例外処理応用
- try-with-resources: try-with-resources構文を使用してファイルリソースを自動解放するコードを作成してください。
- マルチキャッチ: Java7のマルチキャッチ機能を使用して複数例外を処理するコードを作成してください。
- 例外の抑制: try-with-resourcesで発生した例外とブロック内の例外の関係を確認するコードを作成してください。
- Optionalと例外: Optionalを使用して例外発生を回避するコード例を作成してください。
- アサーション: assertを使用して条件チェックを行うコードを作成してください。
上級問題 (6問)
- カスタム例外の活用: 業務ロジックでカスタム例外をスローし、適切に処理するコードを作成してください。
- NIOファイル操作: FilesクラスとPathクラスを使用してファイル操作を行うコードを作成してください。
- シリアライゼーション: オブジェクトをファイルにシリアライズ/デシリアライズするコードを作成してください。
- ロギングフレームワーク: 例外をログファイルに出力するコードを作成してください。
- トランザクション処理: ファイル操作で擬似トランザクションを実装するコードを作成してください。
- リソース管理ユーティリティ: リソース管理を行うユーティリティクラスを作成してください。
Javaの例外処理とファイル入出力 解答例
初級問題の解答
- try-catch基本
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("ゼロ除算が発生しました");
}
- 複数catchブロック
try {
int[] arr = new int[5];
arr[10] = 50; // ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("配列範囲外アクセス");
} catch (Exception e) {
System.out.println("その他の例外");
}
- 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();
}
}
}
- 例外情報取得
try {
// 例外発生コード
} catch (Exception e) {
System.out.println("エラーメッセージ: " + e.getMessage());
e.printStackTrace();
}
- チェック例外処理
try {
Files.readAllLines(Paths.get("nonexistent.txt"));
} catch (IOException e) {
System.out.println("ファイル読み込みエラー");
}
- 非チェック例外
String str = null;
try {
System.out.println(str.length());
} catch (NullPointerException e) {
System.out.println("null参照エラー");
}
- 独自の例外クラス
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
- 例外の再スロー
try {
// 処理...
} catch (IOException e) {
System.out.println("エラー処理");
throw e;
}
- 例外の連鎖
try {
// 処理...
} catch (SQLException e) {
throw new MyException("データベースエラー", e);
}
中級問題の解答
- ファイル読み込み
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();
}
- ファイル書き込み
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello, World!\n");
fw.write("Javaファイル入出力\n");
} catch (IOException e) {
e.printStackTrace();
}
- 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();
}
- ファイル存在確認
File file = new File("test.txt");
if (file.exists()) {
System.out.println("ファイルが存在します");
} else {
System.out.println("ファイルが存在しません");
}
- バイナリファイル読み込み
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();
}
- バイナリファイル書き込み
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello"のバイト表現
try (FileOutputStream fos = new FileOutputStream("binary.dat")) {
fos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
- ファイルコピー
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();
}
- ディレクトリ作成
File dir = new File("new_directory");
if (dir.mkdir()) {
System.out.println("ディレクトリ作成成功");
} else {
System.out.println("ディレクトリ作成失敗");
}
- ファイル削除
File file = new File("temp.txt");
if (file.delete()) {
System.out.println("ファイル削除成功");
} else {
System.out.println("ファイル削除失敗");
}
- ファイル属性取得
File file = new File("document.txt");
System.out.println("サイズ: " + file.length() + " bytes");
System.out.println("最終更新: " + new Date(file.lastModified()));
- 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();
}
- マルチキャッチ
try {
// 複数例外が発生する可能性のあるコード
} catch (IOException | SQLException e) {
System.out.println("IOまたはSQLエラー: " + e.getMessage());
}
- 例外の抑制
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());
}
}
- Optionalと例外
Optional optional = Optional.ofNullable(getPossiblyNullString());
String result = optional.orElse("デフォルト値");
- アサーション
int value = 15;
assert value > 10 : "値が10以下です";
// VMオプションで-eaを指定する必要あり
上級問題の解答
- カスタム例外の活用
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());
}
- 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();
}
- シリアライゼーション
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());
}
- ロギングフレームワーク
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);
}
- トランザクション処理
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;
}
}
}
- リソース管理ユーティリティ
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 -> {
// リーダーを使用した処理
});