0

ヌーブの質問。

次のコードでスタックしました。太字の行で「デフォルトコンストラクターは暗黙のスーパーコンストラクターによってスローされた例外タイプIOExceptionを処理できません。明示的なコンストラクターを定義する必要があります」エラーを取得する

プライベートFileWriterfileWriter= new FileWriter(file); 具体的には、私の質問は.....ファイルライターの明示的なコンストラクターを作成するにはどうすればよいですか?

2番目の問題:メソッドappendtoLogが正しくないことを知っています。このメソッドにbufferWriter.write(logInfo)を実行させたいだけですが、そのためには、すでに作成されているbufferWriterオブジェクトを呼び出す必要があります。しかし、ご覧のとおり、appendtologメソッドで使用できないようにする別のメソッドでインスタンス化しています。plsは私のアプローチの解決策や間違いを提案します。

何か助けはありますか?ありがとう。

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

 public class Logging {


private DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
private Date date = new Date();
private File file = new File("c:\\view\\" + dateFormat.format(date) + "\\"
        +"\\SmokesLog.txt");
private FileWriter fileWriter = **new FileWriter(file);**

public void createLogFile() throws Exception {
try{
if(!file.exists()){
    file.createNewFile();
    System.out.println("file name is "+ file.getName());
      BufferedWriter bufferWriter = new BufferedWriter(new     
  FileWriter(file.getName(),true));
       bufferWriter.write("Log Started for Test");
}
    } catch (IOException e) {
            System.out.println("code failed in creating logfile");
    }

}

public void appendToLog(String logInfo) throws IOException {
    System.out.println("code got to appendToLog method");
    // below does not append.need to find better method.
    if (file.exists()) {
        BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
        bufferWriter.write(logInfo);
        System.out.println("Done");
    }
}
}
4

3 に答える 3

1

人々が言っ​​ているように、それはFileWriterを作成すると例外がスローされるためです。代わりにロガーパッケージを使用することをお勧めしますが、これを克服する方法は次のとおりです。

明示的なコンストラクターを使用して例外をキャッチし、RuntimeExceptionにラップされて再スローする可能性があります。

private FileWriter fileWriter;

public Logging() {
    super();
    try {
       fileWriter = new FileWriter(file);
    }
    catch (IOException e) {
       throw new RuntimeException(e);
    }
}

または、インスタンス初期化ブロックを使用します。これは、コンストラクターでsuper()を呼び出した後、コンストラクター内の他のコードの前に実行されます。あなたの場合、コンストラクターがない場合は、暗黙のsuper()が呼び出されます。これは、Objectを拡張しているため、問題ありません。したがって、初期化ブロックはその直後に実行されます。したがって、以下は上記のコードとほぼ機能的に同等です。

private FileWriter fileWriter;
{
    try {
       fileWriter = new FileWriter(file);
    }
    catch (IOException e) {
       throw new RuntimeException(e);
    }
}

私が言ったように、私はそれをこのようにすることをお勧めしません、そして実際のロギングパッケージ(slf4j + log4j)がより適切でしょう。

于 2012-08-16T03:14:39.583 に答える
1

この行は例外を引き起こす可能性があるためクラスのコンストラクター( Logging)で初期化し、 !ではなく適切な例外処理を実行する必要があります。FileWriter

例外を引き起こす可能性のある暗黙のコンストラクターでコードを使用することはできません。

ログファイルをいつ作成するかを再考してください。たとえば、ファイルがまだ開かれていないときにcreateLogFileを呼び出します。

于 2012-08-16T01:23:35.983 に答える
0

アプリケーション用のロガーを作成しているように見えますがLog4j、既存の(そして定期的にサポートされている)ものを再作成するのではなく、または適切なロギングライブラリのようなオープンソースのロギングライブラリを使用することをお勧めします。

log4jの簡単な紹介:CekiGülcü、2002年3月

使用法:

BasicConfigurator.configure();

Logger logger = Logger.getLogger("Foo");

logger.debug("Hello World");
logger.warn("it's me");

出力:Thread Number Logging Option Class Output

0 [main] DEBUG Foo  - Hello World
1 [main] WARN Foo  - it's me

ダウンロード:こちら

于 2012-08-16T01:30:25.810 に答える