2

正直なところ、私は例外処理の経験があまりありません。なぜなら、怠惰のために例外を処理しない傾向があるからです。それで、ここに非常に基本的な質問があります。

例外処理アプローチを除いて、この状況を達成するための最もクリーンな方法を知りたいです。

コンストラクター内のファイルを読み取るクラス(ConfigManager)があり、コンストラクターパラメーターとして指定されたファイルが正しく構築されるために存在する必要があります。ファイルが存在しない場合は、FileNotFoundExceptionをキャッチし、いくつかのデフォルト値を使用してファイルを作成し、現在使用可能なデフォルトの構成ファイルを使用してConfigManagerオブジェクトの作成を続行します。

ここにいくつかのコードがあります:

class ConfigManager{
    ConfigManager(String file){
         try{
             builder = builderFactory.newDocumentBuilder();
             document = builder.parse (new FileInputStream(file));
             ....
         }catch (FileNotFoundException e) {

        File configFile =  new File (file);

        try {

            configFile.createNewFile();
            BufferedWriter writer = new BufferedWriter(new FileWriter(configFile));
            writer.write(this.defaultConfig);
            writer.close();


            return new ConfigManager(string); //Here's the problem. I can't do that but I need to try build ConfigManager again. How do that?

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}  

デフォルトの構成ファイルが作成された後、新しいConfigManagerオブジェクトを作成するにはどうすればよいですか?それはそのようなタイプの例外を処理するための厳密な方法ですか?

前もって感謝します

4

8 に答える 8

4

できることは、解析を試みる前にファイルが存在することを確認することです。

FileInputStream fis = null;
try {
    fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
    BufferedWriter writer = new BufferedWriter(new FileWriter(configFile));
    writer.write(defaultConfig);
    writer.close();
    fis = new FileInputStream(file);
}

try{
     builder = builderFactory.newDocumentBuilder();
     document = builder.parse (fis);
于 2011-05-16T15:00:30.290 に答える
2

コンストラクターでファイルの読み取りを行わず、ファイルの読み取りと ConfigManager での値の設定を行うメソッド (おそらくプライベート) を作成します。

次に、コンストラクターを再度呼び出そうとするコンストラクターで、メソッドを呼び出します。

つまり、コンストラクターを再度呼び出さないでください。

更新 -- コードを次のように整理します。

ConfigManager(String fileName) {
   File file = new File(fileName);
   if (!file.exists()){
       // create this method -- Im assuming its ok to put the default 
       // config on the path where the file did not exist.
       createDefaultConfigFile(fileName); 
   }

   parseConfigFile(fileName, ...); // create this method too
}

これは明らかに機能するコードではありません。あなたが何をしているのか具体的にはわかりません。しかし、現在のものよりも読みやすく、もう少し整理されています。また、指定されたものが存在しない場合、本当に新しいデフォルト構成ファイルを作成しますか? 構成が存在しないという警告をポップアップ表示しないのはなぜですか? デフォルトを作成する理由があるかもしれません。それが正しい場合は問題ありませんが、そうする必要がない場合は、これ以上作業を追加しないでください...

于 2011-05-16T14:56:10.130 に答える
1

これを実現する最もクリーンな方法は、コンストラクターで例外が発生する可能性のある操作を実行しないことです。オブジェクトを使用する前にそれらを実行する必要がある場合は、別のメソッド init() で実行してください。

于 2011-05-16T14:56:45.220 に答える
1

構成ファイルの解析を別の方法に委譲してみてください。そうすれば、最初にファイルが存在するかどうかを確認してから、デフォルトのファイルを作成するか、既存のファイルをこの新しいメソッドに渡すことができます。

于 2011-05-16T14:56:54.257 に答える
1

実際には、コンストラクターがエラーなしで実行された後、ConfigManager の新しいインスタンスがあります。したがって、問題の行を削除するだけです。

または、静的初期化子の使用を検討してください。これにより、アプリケーションがデプロイ/開始されたときに、ファイルが 1 回だけチェックされます。

于 2011-05-16T14:58:05.853 に答える
1

解決策は、コンストラクターを 2 つの部分に分割することです。最初の部分ではFileInputStream、既存のファイルから を作成しようとします。がスローされた場合はFileNotFoundException、上記のようにファイルを作成して入力し、もう一度 を開きますFileInputStream。2 番目の部分は、最初の部分で開かれたファイルFileInputStreamを (どのように開かれたかに関係なく) 取得し、初期化を続行します。

もう 1 つのオプションは、このロードをinit()メソッドに延期することです。これにより、クラスのコンシューマーはオブジェクトの作成と初期化の両方を行う必要があります。

于 2011-05-16T14:56:01.340 に答える
1

多くの場合、私の怠惰のために、例外を処理しない傾向があります

最初に怠惰を修正することをお勧めします。実際には、あなたは自分自身のためにさらに多くの仕事を作成しているだけです.

于 2011-05-17T01:49:22.860 に答える
1

コンストラクターを再度呼び出すことができる必要がありますが、新しいオブジェクトを作成せずに、同じオブジェクトで呼び出すだけです。Java ではそれができないため、補助メソッドを作成し、コードをコンストラクターからそこに移動してから、コンストラクターから新しいメソッドを呼び出す必要があります。

これは、再帰を実装する必要がある状況での基本的な手法ですが、直接再帰することはできません。

于 2011-05-16T14:56:25.937 に答える