1

私の心が私をだますだけなのか、これが本当に機能していないのかはわかりません。

異なるタイプのLoggingクラスが必要なので、抽象クラスを作成しました。すべてのクラスが同じになる唯一の定義は、writeToLogの処理方法です。

public abstract class LoggerTemplate {

    protected String filename ="log/";
    protected File logfile;

    protected FileWriter fw;

    public void writeToLog(String message) {
        if(fw != null) {
            try {
                message = new SimpleDateFormat("dd-MM-hh:mm").format(new Date()) + " " + message;
                fw.write(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

具体的なサブクラスは、コンストラクターに残りのロジックを実装します。つまり、次のいずれかです。

public class JitterBufferLogger extends LoggerTemplate {

    public JitterBufferLogger() {
        super();
        filename += new SimpleDateFormat("yyyyddMMhhmm'.log'").format(new Date());

        if(!new File("log/").exists())
            new File("log").mkdir();


        logfile = new File(filename);
        try {
            logfile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            fw = new FileWriter(logfile);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

しかし、デバッグすると、特定のロガーに対してwriteToLogを呼び出すと、LoggerTemplateメソッドにジャンプするため、fwとlogfileがnullであることがわかります。だからそれは機能していません。

それはうまくいくはずではないのですか、それとも私は何かを少し台無しにして週末に行くべきですか;-)

4

2 に答える 2

1

では、何が欠けているのでしょうか?-ファイルライターのフラッシュが役立つ可能性があります。-元のコードではnull値を再現できません。何が起こったのか、わかりません。-しかし、私を含むすべての人が言ったように、それは機能するはずであり、機能します。

ログファイルに何もなかったのはなぜですか?-fwのフラッシュが欠落していた可能性があります。

とにかく私はそれをプリントライターで包んだ:

public abstract class LoggerTemplate {

    protected String filename ="log/";
    protected File logfile;

    protected PrintWriter pw;

    public void writeToLog(String message) {
            try {
                pw = new PrintWriter(new FileWriter(logfile,true));
                message = new SimpleDateFormat("dd-MM-hh:mm").format(new Date()) + " " + message + "\n";
                pw.write(message);
                pw.flush();
                pw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

そして今、それは期待通りに機能しており、期待されていました。具体的なサブクラスでのfwのインスタンス化はもう必要ないことに注意してください。

于 2012-06-22T10:44:27.360 に答える
1

メソッドに入るとデバッガーがLoggerTemplateクラスにステップインするのは正常なことwriteToLog()です。基本クラスの属性にnull値があるのは奇妙なことです。

次の短いテストプログラムを使用してコードをテストしました。

public class Test {
    public static void main(String[] args) {
        LoggerTemplate lt = new JitterBufferLogger();
        lt.writeToLog("Hello");
    }
}

呼び出しの直後にメソッドに追加fw.flush()した後、それは私のために機能し、ログファイルが作成され、ログメッセージが含まれていました。LoggerTemplate.writeToLog()fw.write()

stderrがどこかにリダイレクトされていたため、new File("log").mkdir()または他のいくつかの呼び出しが、表示できない例外をスローする可能性があります。

于 2012-06-22T10:39:35.463 に答える