2011-12-17 30 views
2

在PHP中,我總是隻有var_dump'd的一切。在Java中,當我調試諸如BFS的程序時。我發現這一切都非常困難,特別是當有很多循環時。什麼是幫助調試Java的有效方法/工具?

我想我有一個不好的做法和工作流程。我可以使用JUnit,但是當我必須經過每一步才能確保每一件事情都是真的或假的,並且如果變量正確設置並檢查每個部分,我不確定JUnit是否比System.out.println更快。

我相信我可能會做錯某些事情,所以我想問社區好些做法。

編輯:我使用Eclipse,只是爲了讓大家知道。但是,我不知道如何利用它的每一個方面。我只是編寫代碼,調試和編譯。有時候我需要使用JUnit。

+6

對於調試,請使用調試器。對於單元測試,請使用單元測試框架。他們是不同的東西。 – 2011-12-17 08:46:57

+0

並使用記錄器進行日誌記錄 – 2011-12-17 09:37:44

+0

@pst感謝標題改變! – Strawberry 2011-12-17 12:37:55

回答

2

而不只是打印調試信息發送到控制檯啓動,使用記錄系統,如log4j

這提供了動態日誌級別和日誌記錄可以通過配置發送到一組旋轉文件。 (即在開發過程中記錄大量數據,只記錄生產中的錯誤,而不必更改課程代碼。)

0

我強烈建議使用NetBeans或Eclipse等IDE。他們帶有一個調試器。

1

我對Java編碼還很陌生,但我發現創建一個Debug類並調用它非常有用,而不是進行很多System.out.println調用。

我調試運行類是這個樣子..

Debug.java

public class Debug { 
    private static boolean debugActive = true; 
    public static void setDebug(boolean debug) { 
     Debug.debugActive = debug; 
    } 

    public static void print(String str) { 
     if (debugActive) { 

      StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); 
      StackTraceElement e = stacktrace[2]; 
      String methodName = e.getMethodName(); 

      System.out.print("[" + e + "]"); 
      System.out.print(" => " + str); 
      System.out.println(" <= "); 

     } 
    } 

    public static void print(int x) { 
     print(x + ""); 
    } 
} 

因此,從程序

DbIniParser.java調用它..

[...] 
    Debug.print(DB_User); 
    Debug.print(DB_Pass); 
    Debug.print(database); 
    Debug.print(host); 
    Debug.print(port); 
    [...] 

主程序。

Debug.setDebug(true); 
DbIniParser ini = new DbIniParser(); 
ini.readFile(); 
Debug.setDebug(false); 

這提供了一個輸出..

控制檯輸出

[hospitalcase.DbIniParser.readFile(DbIniParser.java:35)] => hjess <= 
[hospitalcase.DbIniParser.readFile(DbIniParser.java:36)] => password <= 
[hospitalcase.DbIniParser.readFile(DbIniParser.java:37)] => myFunnyDatabase <= 
[hospitalcase.DbIniParser.readFile(DbIniParser.java:38)] => localhost <= 
[hospitalcase.DbIniParser.readFile(DbIniParser.java:39)] => 3306 <= 

通過使用類本身的輸出可以改變爲日誌文件或別的東西。

請注意,我只在3個月內完成編程,所以這種方式可能不是最佳的,但我發現它相當有用,而不是每次都做System.out.print