2012-06-22 132 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實例化不再需要。