2012-11-07 26 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,并且代码不符合大多数世界使用的事实上的编码标准(类名称应该以大写字母开头,变量名称不应该包含下划线)。