2017-02-18 4 views
-2

私は、コマンドラインから渡されたファイルを開いて読み込もうとしています。system.err.printlnと例外をスローするだけの違いはありますか? (java)

これは私がこれまで持っているものです。

import java.io.*; 

public class Test { 

    public static void main(String[] args) throws FileNotFoundException { 

     if ((args[0].length() == 0) || (args[0] == null) || (args[0].isEmpty())) { 
      System.err.println("Usage Error: No file name was provided."); 
      System.exit(1); 
     } 

     File file = new File(args[0]); 

     if (!file.exists()) { 
      System.err.println("Usage Error: The file, " + args[0] + ", does not exist."); 
     } 

     if (!file.canRead()) { 
      System.err.println("Usage Error: The file, " + args[0] + ", cannot be read."); 
     } 
    } // main 
} 

は、私は、ファイルが見つからない例外を処理する方法を完全に確認していません。私の先生はtry/catchブロックについて言及しましたが、ここにそれらが必要かどうかはわかりませんでした。ファイルが引数として渡されたかどうかを確認し、System.err.print()メソッドを使用してユーザーにエラーを通知していないかどうかを確認するだけで十分ですか?

また、System.err.print()が呼び出された場合は、その後にプログラムが終了します(つまり、その後にSystem.exit(1)を含める必要がありますか)。それとも、それはより良い(デザインの面で)ちょうどこのような何かをすることです:

public void readFile() throws FileNotFoundException { 
    // try to open file here 
} 

public static void main(String[] args) { 
    try { 
     readFile(); 
    } catch (Exception e) { 
     // exception handled here 
    } 
} 

は、私はちょうど、ユーザーが実際にはファイル名などの文字列を渡し、それが/を読み取ることができますが存在することを確認する必要があります。

+0

違いは同じではないという点です。 Oneは出力をコンソールに出力します。もう1つはプログラムフローを変更します。これはすべて文書化されています。推測する必要はありません。 – EJP

答えて

0

例外を使用すると、プログラムでエラーを処理しやすくなります。

意味:あなたのプログラムが主な機能のみで構成されており、「ファイルがありません」ということをユーザに伝えたいとき。あなたのプログラムがstderrに妥当なメッセージを出力した場合、それはあまり差をつけません。いくつかのゼロ以外の戻りコードが存在します。または例外をスローした場合。

これとは逆に、あなたの簡単な例では、 1つ実際には例外をスローし、スタックトレースを(潜在的に混乱させる)JVMでユーザーに表示させるよりも、正確なエラーメッセージが優先されます。

:あなたの現在のプログラムはほんの小さな例です。プログラムが大きくなると、プログラムはさまざまなコンポーネントのさまざまなクラスへの呼び出しで構成されます。そして、stderrに印刷するのは良い考えではありません。次に、問題に遭遇する1つのレイヤーに、この状況を伝えるための明確な方法があることを確認します。それが例外の意味です。このような状況では、例外を非常に好むでしょう。いくつかの上位層がそれらを捕まえることができるから - 何をすべきかを決めるからです。たとえば、プログラムがUIパネルにエラーメッセージを表示することができます。またはメッセージをログファイルに入れることができます。または一部の携帯電話にテキストメッセージを送信することができます。あなたがスタンダードにしか印刷していないなら、それはすべて不可能に近いでしょう。

0

// exception handled hereではcatchで、任意のコードを書くことができます。 例外をスローした場合は、Java自体がいくつかのスタンダードなことをしています。

0

有効なJava(2nd Edition)ブック形式のJoshua Blochを読んでください。 項目57(例外条件のみの例外の使用)では、このトピックのすべての項目を明確にします。

関連する問題