好的,我一直在环顾四周,做了很多谷歌搜索,但我仍然找不到避免这种警告的方法。
Integer result = chooser.showOpenDialog(null);
if (result.equals(0))
{
String tempHolder = chooser.getSelectedFile().getPath();
filenameLoad = new File(tempHolder);
filenameSave = filenameLoad;
FileInputStream fis = null;
ObjectInputStream in = null;
try
{
fis = new FileInputStream(filenameLoad);
in = new ObjectInputStream(fis);;
}
catch(IOException ex)
{
ex.printStackTrace();
}
try
{
loadFile = (ArrayList<Dot>)in.readObject();
}
catch(IOException ex)
{
System.out.println("Cast fail");
}
catch(ClassNotFoundException ex)
{
System.out.println("Cast fail");
}
catch (ClassCastException ex)
{
System.out.println("Cast fail");
}
try
{
in.close();
}
catch(Exception ex)
{
System.out.println("failed to close in");
}
save.setEnabled(true);
gpanel.setDotList(loadFile);
}
它在行loadFile =(ArrayList)in.readObject()中给出了警告;我已经添加了捕获量,所以我不确定为什么它仍然说它没有捕获。有帮助吗?感谢?
答案 0 :(得分:10)
它不是“未捕获”,而是“未经检查”。 JVM无法在运行时告知,即在完成转换时,ArrayList是否真的包含Dot元素。
每当从原始类型转换为泛型类型时,都会发出此警告。如果您确定演员阵容没问题,则可以使用注释来抑制警告
@SuppressWarnings("unchecked")
为此,最好将演员表封装在一个小而单独的方法中。
答案 1 :(得分:2)
您没有检查
返回的对象in.readObject();
真的是
ArrayList<Dot>
使用
ArrayList<Dot> dotList = null;
Object obj = in.readObject();
if (obj instanceof ArrayList<Dot>)
{
dotList = (ArrayList<Dot>) obj;
}
答案 2 :(得分:1)
它没有说uncatched
(拼写正确uncaught
),而是unchecked
。在转换为泛型类型时,您无法避免此警告,您只能禁止它。或者你可以解决它:
@SuppressWarnings("unchecked")
public static <T> T castToAnything(Object obj) {
return (T) obj;
}
使用此方法,您可以写:
loadFile = castToAnything(in.readObject());
答案 3 :(得分:0)
这意味着编译器无法检查您读入的对象是否与您将其转换为的类型相匹配。因此,未经检查的警告。
BTW:您可能希望处理错误处理,以使其更简单,更清晰。 ;)
答案 4 :(得分:0)
您看到的是编译器警告您正在尝试将对象转换为ArrayList<Dot>
,而不首先检查对象是否实际包含点列表而不是例如Foo列表。