Java class المجرد "متغيرات الحالة"

لا أعلم إذا كان ذهني يخدعني فقط أو لا يعمل حقاً.

أحتاج إلى نوع مختلف من فصول التسجيل ، لذا قمت بإنشاء فئة تجريدية ، التعريف الوحيد الذي سيكون لكل الفئات نفس الطريقة التي يتم بها التعامل مع writeTog:

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();
        }
    }
}

ولكن عندما أقوم بتصحيح أستطيع أن أرى أنه عند استدعاء writeTogLog لمسجل محدد ، فإنه يقفز إلى الأسلوب LoggerTemplate ، وبالتالي تكون fw و logfile خالية. لذلك لا يعمل.

أليس من المفترض أن يعمل أو أفعل شيئًا فوضًا شيئًا فشيئًا ويجب أن أذهب إلى عطلة نهاية الأسبوع ؛-)

0
جديد ErrorLogger (). WriteToLog ("اختبار مهارات derp بلدي")؛ ولكن المشكلة الرئيسية بدت أن مهاجم لم يكتب بشكل صحيح إلى الملف. أنا محفظته مع كاتب الطباعة ، وأنها تعمل كما هو متوقع. لا أعرف ما أفسد ذهني ولكن بطريقة ما شيء ما فعل ..
وأضاف المؤلف Stefan, مصدر
يرجى عرض مثال على المكالمة.
وأضاف المؤلف John B, مصدر
هل قمت بفحص تتبع المكدس عند فتح كاتب الملف؟ تعليق Per @ MartinK ، ربما يكون اسم الملف غير صالح مشكلتك.
وأضاف المؤلف John B, مصدر
ضع في اعتبارك وجود file parentDir في فئتك الأساسية وامتلك منشئ الفئة الأساسي ملءها وأنشئ dir. ثم في الطبقة الملموسة تقوم بالملف (super.parentDir، fileName) أو super.parentDir.createNewFile (fileName)
وأضاف المؤلف John B, مصدر
هذا "يجب" العمل (بخصوص تعيين متغيرات عضو super-class). هل قمت debug في مُنشئ JitterBufferLogger ؟ من المحتمل أن يذهب stdout إلى موقع غير متوقع وأنت غاب عن stacktraces. أيضاً ، "log/.20122012.log" (الشرطة المائلة) ليس اسم ملف صالح - راجع logfile.createNewFile (filename).
وأضاف المؤلف MartinK, مصدر

2 إجابة

إذن ما هو الشيء المفقود؟ - يمكن أن يكون ساعدت filewr فلاش. - لا أستطيع إعادة إنتاج القيم الخالية بالشفرة الأصلية ، لا أعرف ما حدث. - ولكن كما قال الجميع ، بما فيهم أنا ،: يجب أن ينجح ويفعل ذلك.

لماذا لم يكن شيء في ملف السجل؟ - ربما كان تدفق المهاجم مفقودًا ..

على أي حال أنا ملفوفة مع مطبوعات:

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 في الفئات الفرعية الملموسة.

0
وأضاف

يجب أن تعمل ، من الطبيعي ، أن debugger stepped داخل فئة LoggerTemplate عند إدخال writeToLog() الأسلوب. ما هو الغريب أن السمات في الفئة الأساسية تحتوي على قيمة .

لقد اختبرت شفرتك مع برنامج الاختبار القصير التالي:

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

بعد إضافة fw.flush() إلى LoggerTemplate.writeToLog() فقط بعد fw.write() المكالمة ، كان يعمل بالنسبة لي ، تم إنشاء ملف السجل وكان يحتوي على رسالة السجل.

ربما جديد File ("log"). mkdir() أو بعض المكالمات الأخرى تلقي استثناءً لا يمكنك رؤيته ، لأن stderr قد تم إعادة توجيهه في مكان ما.

0
وأضاف
yap ، يجب أن يكون stepp إلى LoggerTemplate هناك ، وإلا كيف يعمل. ربما فشل تدفق فقط ، سأقوم بتحديث منصبي مع التفاف جديد مع PrintWriter الذي يعمل الآن.
وأضاف المؤلف Stefan, مصدر