2011-10-27 58 views
4

默認情況下,在Netbeans中查看對象的手錶/變量時,會顯示其地址而不是其值。這非常令人厭煩,因爲我必須展開變量才能看到它的實際值(例如Double,Integer,Date等)。事實證明,Netbeans擁有「可變格式化器」,但幾乎沒有任何文檔可以爲它找到。如何使用Netbeans變量格式器?

我該如何去顯示例如在Watches/Variables窗口中以可讀的格式顯示一個簡單的Date變量?我不完全理解「編輯變量格式化工具」對話框。

我能夠通過使用下面的代碼片段正確做到這一點的雙人牀和整數: toString()

所以代碼似乎在雙/整數類的上下文中運行。如何將我指的是實際的變量,如果我需要做一些更高級的如:

return DateHelpers.formatDate(dateVariableName??, "yyyy-MM-dd"); 

回答

6

在查看變量,你有一個小$圖標(左上角),它提示說:「顯示變量值作爲toString()或格式化值「。

只要點擊它,它就會顯示這些變量的「值」。

編輯:如果你想添加一個變量格式化程序,它非常簡單。在可變格式化視圖,只需點擊「添加...」按鈕,然後:

  • 在「格式化名稱」把你格式化如名稱。 「我的日期格式化程序」
  • 「類型」將您的完整類名稱,例如。 java.util.Date
  • 選擇「作爲代碼片段結果格式化的值」並鍵入要應用的代碼。例如:

toString()

,但如果你要處理的數據或顯示一些其他的事情就可以了。例如:

toString() + " (" + getTime() + ")" 

這將以人類可讀的格式顯示時間加上時間長。

不要忘記選擇視圖上的$圖標來應用您的格式化程序。

+1

如何在赫克我錯過了這!必須意外關閉它。謝謝!是否可以將該變量作爲參數傳遞給對話框中的某個方法(它負責格式化)?它是否有一些默認名稱? – AtliB

+0

對不起,我想知道,但我不知道。 –

1

只要你返回一個字符串,你甚至可以把更復雜的代碼放在變量格式器中。舉例來說,如果我有一個類有兩個字符串成員,姓名我可以粘貼follwing代碼中的「格式化值...」對話框:

String result; 
if (name != null) { 
    result = name + " " + surname; 
} else { 
    result = "<null>"; 
} 
return result; 

..和用於顯示兒童的姓名分別可以在框中「顯示爲..兒童」粘貼代碼返回一個字符串[],例如:

String[] results = new String[2]; 
results[0] = "name: " + name; 
results[1] = "surname: " + surname; 
return results; 

這將顯示兩個節點作爲孩子的變量調試窗口的名稱和姓

2

我的回答不會解決問題。它會迴應以前的答案。首先,我沒有在NetBeans中的變量面板中看到$符號。似乎它被當前版本中的上下文菜單取代。

在「變量格式化程序」對話框中,我還沒有找到實際問題的答案,至於如何引用要調試的變量。像「這個」或「$ 1」這樣的東西不能正常工作。此外,該設施似乎並不瞭解像SimpleDateFormatter這樣的標準Java JRE類。

所以當調試Java JRE類時,我想你必須忍受他們提供的公共方法。

如果您遇到JDK低於版本8(和我一樣)的情況,那麼對於特別用戶友好的Date類,下面是一個解決方法。通過

Tools > Options > Java > Variable Formatters > Add 

然後在「類類型」就在NetBeans中創建一個新的變量格式化EditField中輸入:

java.util.Date 

在「數值格式爲代碼片段的結果」使用的下一個片段之一。

// German format - "dd.MM.yyyy hh:mm" 
((getDate() < 10) ? ("0" + getDate()) : getDate()) + "." + ((getMonth() < 9) ? ("0" + (getMonth() + 1)) : (getMonth() + 1)) + "." + (getYear() + 1900) + " " + ((getHours() < 10) ? "0" + getHours() : getHours()) + ":" + ((getMinutes() < 10) ? "0" + getMinutes() : getMinutes()) + ":" + ((getSeconds() < 10) ? "0" + getSeconds() : getSeconds()) 

// US format - "MM/dd/yyyy hh:mm" 
((getMonth() < 9) ? ("0" + (getMonth() + 1)) : (getMonth() + 1)) + "/" + ((getDate() < 10) ? ("0" + getDate()) : getDate()) + "/" + (getYear() + 1900) + " " + ((getHours() < 10) ? "0" + getHours() : getHours()) + ":" + ((getMinutes() < 10) ? "0" + getMinutes() : getMinutes()) + ":" + ((getSeconds() < 10) ? "0" + getSeconds() : getSeconds()) 

// ISO-8601 - "yyyy-MM-dd hh:mm" 
(getYear() + 1900) + "-" + ((getMonth() < 9) ? ("0" + (getMonth() + 1)) : (getMonth() + 1)) + "-" + ((getDate() < 10) ? ("0" + getDate()) : getDate()) + " " + ((getHours() < 10) ? ("0" + getHours()) : getHours()) + ":" + ((getMinutes() < 10) ? ("0" + getMinutes()) : getMinutes()) + ":" + ((getSeconds() < 10) ? ("0" + getSeconds()) : getSeconds()) 

下一個片段也可以派上用場,當你在java.util.Calendar中的一個實例的調試輸出矯枉過正丟失:

// German format - "dd.MM.yyyy hh:mm" 
((get(5) < 10) ? ("0" + get(5)) : get(5)) + "." + ((get(2) < 9) ? ("0" + (get(2) + 1)) : (get(2) + 1)) + "." + (get(1)) + " " + ((get(10) < 10) ? "0" + get(10) : get(10)) + ":" + ((get(12) < 10) ? "0" + get(12) : get(12)) + ":" + ((get(13) < 10) ? "0" + get(13) : get(13)) 
+0

在netbeans 8上,$ sign功能似乎可以作爲表格模式下的變量監視視圖中的額外列直接使用 – Dfaure

+0

明白了。謝謝。儘管如此,對於上面關於Calendar類的例子,你需要一個如圖所示的變量格式化程序,以在該列中放置一個有意義的值。要再次引用原始問題,您嘗試調試的實例的類總是必須提供一種方法,例如, getValue()在變量格式化程序中使用它。 – user3469861