この例外がスローされる場所を認識する必要があります。そして、場所はこの行です:
RandomAccessFile store = new RandomAccessFile(file, "rw");
はFileNotFoundExceptionのAPIを見て、あなたはRandomAccessFileのコンストラクタで、期待と同じようにスローされます知っています。次のコードでのRandomAccessFileのないあなたのロジック
テストは、:
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("Please input the file location and name.");
String filepath = input.next();
File file = new File(filepath);
if (file.exists()) System.out.println("EXISTS!"); else System.out.println("DOESN'T EXIST!");
}
}
さて、問題の最初の部分は、明確にする必要があります。関数file.exists()
が正しく機能します。ロジックの脆弱性は、RandomAccessFileコンストラクタがファイルを作成できるが、必ずしもそうではないという事実から来ている。そのため、例外を処理する必要があります。以下は、Java 8 APIからのコンストラクタの抜粋です。
FileNotFoundException - モードが "r"であるが、指定されたファイルオブジェクトが既存の通常ファイルを示さない場合、またはモードが "rw"で始まる場合指定されたファイルオブジェクトは既存の書き込み可能な通常ファイルを示さず、その名前の新しい通常ファイルを作成できないか、またはファイルを開いたり作成しているときに他のエラーが発生した場合
コードの他の部分は次のようになります。
try {
RandomAccessFile store = new RandomAccessFile(file, "rw");
String dummy = "Empty record ";
for (int i = 0; i < MAX_RECORD_NUMBER; i++) {
store.writeUTF(dummy);
}
} catch (FileNotFoundException e){
System.err.println("File cannot be created!");
}
しかし、これはenougではありませんh、例外サービスに関しては、ここではwriteUTF(dummy)
関数を使用しているためです。
IOException - I/Oエラーが発生した場合。(RandomAccessFileのAPIによると)
したがって、IOExceptionを処理する必要があります。既存の一から一以上のcatch句、これを追加する例:
catch (IOException e){
System.err.println("Couldn't write to file!");
}
それとものIOExceptionのサブクラスであり、IOExceptionを持つただ一つのcatch句を持っているとして、あなたは、FileNotFoundExceptionををスキップすることがあります。しかし、あなたが見ることができるように、ここでは2つの異なる原因を明らかにしています。
それで結局、あなたのクラスは次のようになります。
import java.io.*;
import java.util.Scanner;
public class Main {
final private static int MAX_RECORD_NUMBER = 20;
final private static int RECORD_LENGTH = 71;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("Please input the file location and name.");
String filepath = input.next();
File file = new File(filepath);
//if (file.exists()) System.out.println("EXISTS!"); else System.out.println("DOESN'T EXIST!");
try {
RandomAccessFile store = new RandomAccessFile(file, "rw");
String dummy = "Empty record ";
for (int i = 0; i < MAX_RECORD_NUMBER; i++) {
store.writeUTF(dummy);
}
} catch (FileNotFoundException e){
System.err.println("File cannot be created!");
} catch (IOException e){
System.err.println("Couldn't write to file!");
}
}
}
いくつかの部品が必要とされていませんでした。私のソリューションを分析し、あなたの間違いを明らかにする必要があります。または、私にもっと尋ねてください。この答えは、とにかく少し長いです。
最後のメモ。他のスレッドの人は、同様のものと混同されました。右側のリンクを見ることができます。短いストーリーを短縮するには、ファイルの絶対パスを使用します。詳細については、リンクを確認してください。
チェック例外の概念を理解していますか? – Dici
@Diciはい。だからそれはすべてのチェック例外についてですか?私はチェック例外をスローしなかった場合、日食は私を通過させないと思った。しかし、私がコーディングしているときには何のエラーも見られませんでした。 –
あなたの質問のタイトルを改訂する必要があります。あなたが書いたすべての質問は、将来の人(あなただけでなく)のためのものであることを覚えておいてください。 – zhon