2016-07-24 15 views
-1
public class Main { 

final private static int MAX_RECORD_NUMBER = 20; 
final private static int RECORD_LENGTH = 71; 

public static void main(String[] args) throws IOException, FileNotFoundException{ 
    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); 

    boolean isExisted = file.exists(); // Problem exists here if I delete FileNotFoundException 

    RandomAccessFile store = new RandomAccessFile(file, "rw"); 

    if (!isExisted) { 
     String dummy = "Empty record               "; 
     for (int i = 0; i < MAX_RECORD_NUMBER; i++) { 
      store.writeUTF(dummy); 
     } 
    } 

私はここで小さな不具合に悩まされています。私がFileNotFoundExceptionをスローしなかった場合、file.exists()メソッドはに常にtrueを返します。(実際にはファイルは実際にはありませんでした)。この場合、メインメソッドの先頭にFileNotFoundExceptionをスローしないと、そのファイルにwriteUTFを書くことができません。これは愚かな質問でなければならないが、私はちょうどこれの背後にあるメカニズムが何であるか知りたい。 APIは私を助けません。私に説明できる人は本当にありがたいです。最初にFileNotFoundExcetionをスローしないと、file.exists()は常にtrueを返します。

編集:申し訳ありませんが、私は以前は不明でした。私が本当に尋ねたかったのは、.exists()メソッドがfalseやその他の予期しないエラーの代わりに常にtrueを返す理由です。

+1

チェック例外の概念を理解していますか? – Dici

+0

@Diciはい。だからそれはすべてのチェック例外についてですか?私はチェック例外をスローしなかった場合、日食は私を通過させないと思った。しかし、私がコーディングしているときには何のエラーも見られませんでした。 –

+0

あなたの質問のタイトルを改訂する必要があります。あなたが書いたすべての質問は、将来の人(あなただけでなく)のためのものであることを覚えておいてください。 – zhon

答えて

2

この例外がスローされる場所を認識する必要があります。そして、場所はこの行です:

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!"); 
     } 
    } 
} 

いくつかの部品が必要とされていませんでした。私のソリューションを分析し、あなたの間違いを明らかにする必要があります。または、私にもっと尋ねてください。この答えは、とにかく少し長いです。

最後のメモ。他のスレッドの人は、同様のものと混同されました。右側のリンクを見ることができます。短いストーリーを短縮するには、ファイルの絶対パスを使用します。詳細については、リンクを確認してください。

+0

あなたは自分のロジックで間違いをはっきりと見つけましたが、あなたは本当に答えていません。彼が答えを推測させないようにして、あなたの答えの後の読者について考えてください。私はあなたの質問を編集するときupvoteよ: – Dici

+0

今ははっきりしている必要があります。あるいは、私は質問の一部を見ません。 – tomasz

+0

さて、私は今、他の部分を参照してください。 – tomasz

0

これはJava APIから直接です:何かあれば

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); 
boolean isExisted = file.exists(); 

try{ 

    RandomAccessFile store = new RandomAccessFile(file, "rw"); 

    if (!isExisted) { 
     String dummy = "Empty record               "; 
     for (int i = 0; i < MAX_RECORD_NUMBER; i++) { 
      store.writeUTF(dummy); 
     } 
    } 
}catch (FileNotFoundException e){ 
    System.err.println("File not found!"); 
    e.printStackTrace(); 
}catch (IOException e){ 
    System.err.println("Couldn't write to/read file!"); 
    e.printStackTrace(); 
} 

この方法:だから、あなたはそうのようなtry-catchブロックで

RandomAccessFile store = new RandomAccessFile(file, "rw"); 

を囲むことができ

java.io.FileNotFoundException 

This exception will be thrown by [...] when a file with the specified pathname does not exist. 

間違っている(ユーザが間違ったパスを入力する/ユーザがファイルを読み書きする権限がない)プログラムがクラッシュするのではなく、エラーを察知してください。 try-catchブロックの詳細については、hereを参照してください。

+0

彼はすでにそれを伝播することもできます – Dici

+0

もちろん、彼はキャッチを置き換えるファイルを開く前に存在を確認することができますが、彼は彼が読み取り/書き込み権限を持っているかどうかを判断するチェックはありませんファイルが存在していても、それが存在していても、そのファイルが存在していても、そのファイルは存在しています。 –

+0

私は彼が 'throws'節に例外を追加できることを意味します(私はdownvoterではありません) – Dici

関連する問題