2012-11-07 27 views
0

最近,我開始編程在java中我做了這個代碼: https://github.com/mouuff/JavaMD5cracker的Java編譯警告不安全狀態

的代碼工作,但我得到這個creppy警告:

C:\Users\mou\Desktop\JavaMD5cracker-master>javac icrackmd5.java 
Note: .\brute.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

聽起來像編譯器找到這一行( brute.java:L 26)不安全或我不知道......

if (tries > (int)pows.get(lenght-1)) 

有人可以幫助我嗎?

+0

請在您的問題中包含更多的代碼。我們需要知道'pows'是什麼。 – 2012-11-07 14:03:46

+0

「pows」聲明如何? – jlordo

+0

您可能需要提供更多的上下文。 –

回答

2

其因爲在brute.java您的哈希表聲明

Hashtable pows = new Hashtable(); 

當編譯器執行此行

if (tries > (int)pows.get(lenght-1)) 

它不知道是什麼元件從戰俘類型是。

使用泛型

Hashtable<Integer, Integer> pows = new Hashtable<Integer,Integer>(); 
+1

類'Hashtable '需要關鍵和值的泛型類型參數! – jlordo

+0

@jlordo編輯它,謝謝。我在想這是hashSet ..:P – PermGenError

1

這只是您在另一個對象中爲int進行投射操作。這是一個未經檢查的操作,因爲編譯器無法檢查您返回的pows.get(length-1)是否可以真正轉換爲int

如果你相信(我的意思是真的相信)你的代碼,並知道了int鑄造總是可以做,你可以讓這樣的說法,它只是一個編譯器警告。

同時,看看Math對象。也許有一種簡單而安全的方式來完成你正在努力完成的任務。

編輯

更改此:

Hashtable pows = new Hashtable(); 

要:

Hashtable<Integer,Integer> pows = new Hashtable<Integer,Integer>(); 

將擺脫你的編譯器的筆記。

+0

以及如何解決它? – mou

+0

立即着手 –

+0

查看我的版本以瞭解如何修復它 –

1

brute包含此更改您的哈希表的聲明:

Hashtable pows = new Hashtable(); 

它使用原始類型Hashtable。泛型應該在這裏使用。此外,它應該使用HashMap而不是舊版集合類Hashtable

Map<Integer, Integer> = new HashMap<Integer, Integer>(); 

演員將被不必要的:

if (tries > pows.get(lenght-1)){ 

(請注意, 'lenght' 拼寫錯了,它應該是 '長')。

此外,成員變量應該是private,並且代碼不符合大多數世界使用的事實上的編碼標準(類名稱應該以大寫字母開頭,變量名稱不應該包含下劃線)。