Java编译警告不安全的情况

时间:2012-11-07 14:02:26

标签: java compiler-warnings javac

我最近开始用java编程我做了这段代码: https://github.com/mouuff/JavaMD5cracker

代码工作但我得到了这个警告:

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))

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

因为您在 brute.java

中的哈希表声明
Hashtable pows = new Hashtable();

编译器执行此行时

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

它不知道 pows 中元素的类型是什么。

使用泛型

更改哈希表声明
Hashtable<Integer, Integer> pows = new Hashtable<Integer,Integer>();

答案 1 :(得分:1)

只是你正在另一个对象中为int进行强制转换操作。这是一个未经检查的操作,因为编译器无法检查pows.get(length-1)返回的内容是否真的可以转换为int

如果你信任(我的意思是真的相信)你的代码,并且知道总是可以完成int的转换,你可以这样做,它只是一个编译器警告。

同时,看看Math对象。也许有一种简单而安全的方式来完成你想要完成的任务。

修改

更改此内容:

Hashtable pows = new Hashtable();

要:

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

将摆脱你的编译器笔记。

答案 2 :(得分:1)

班级brute包含以下内容:

Hashtable pows = new Hashtable();

它使用原始类型Hashtable。应该在这里使用泛型。此外,它应该使用HashMap而不是旧版集合类Hashtable

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

演员阵容将是不必要的:

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

(注意'lenght'拼写错误,应该是'长度')。

除此之外,成员变量应该是private,并且代码不符合世界上大多数人使用的事实上的编码标准(类名应该以大写字符开头,变量名称不应包含下划线。)