2012-06-22 76 views
1

我不知道我的大脑是否愚弄我,或者这真的不起作用。Java抽象类“实例变量”

我需要不同类型的日志记录类的,所以我创建了一个抽象类,所有类都将具有相同的唯一定义是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和日志文件为空。所以它不工作。

是不是它应该工作或做我只是乱七八糟的东西有点起来,应该进入周末;-)

+2

这个“应该”工作(关于分配超类成员变量)。你是否调试过JitterBufferLogger的构造函数?大概是标准输出到一个意想不到的位置,你错过了堆栈跟踪。另外,'log/.20122012.log'(斜杠)不是有效的文件名 - 请参阅logfile.createNewFile(文件名)。 – MartinK

+0

请给出一个示例调用。 –

+0

你是否打开文件编写器检查堆栈跟踪? Per @ MartinK的评论,无效的文件名可能是你的问题。 –

回答

1

它应该工作,这是正常的,调试器在进入跨进LoggerTemplatewriteToLog()方法。奇怪的是基类中的属性值有null

我有以下短的测试程序进行测试代码:

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

只是fw.write()电话后加入fw.flush()LoggerTemplate.writeToLog()方法后,它的工作对我来说,已经创建日志文件,它包含日志消息。

也许new File("log").mkdir()或其他一些呼叫会抛出一个您看不到的异常,因为stderr已被重定向到某处。

+0

yap,LoggerTemplate的步骤必须在那里,它应该如何工作。也许冲洗只是失败,我会用新的包装与PrintWriter现在的作品更新我的帖子。 – Stefan

1

那么可能会丢失什么? - filewriter冲洗可能有帮助。 - 我不能用原始代码重现空值,不知道发生了什么。 - 但包括我在内的每个人都说:它应该起作用,而且确实如此。

为什么没有在日志文件中? - 也许fw的冲洗不见了..

无论如何我使用PrintWriter把它包:

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实例化不再需要。