3

好的,我一直在环顾四周并做了很多谷歌搜索,但我仍然找不到避免这个警告的方法。

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(); 行给了我警告 我已经添加了捕获,所以我不确定为什么它仍然说它没有捕获。有什么帮助吗?谢谢?

4

5 回答 5

10

它不是“未捕获”,而是“未检查”。JVM 无法在运行时(即转换完成时)判断 ArrayList 是否真的包含 Dot 元素。

每当您从原始类型转换为泛型类型时,都会出现此警告。如果你确定演员没问题,你可以用注释抑制警告

@SuppressWarnings("unchecked")

为此,最好将铸件封装在一个小的、单独的方法中。

于 2011-04-12T07:07:20.673 回答
2

您没有检查对象是否返回

in.readObject();

真的是一个

ArrayList<Dot>

采用

ArrayList<Dot> dotList = null;
Object obj = in.readObject();
if (obj instanceof ArrayList<Dot>)
{
dotList = (ArrayList<Dot>) obj;
}
于 2011-04-12T07:10:05.853 回答
1

它没有说uncatched(正确拼写为uncaught),而是unchecked. 在转换为泛型类型时,您无法避免此警告,您只能禁止它。或者你可以解决它:

@SuppressWarnings("unchecked")
public static <T> T castToAnything(Object obj) {
  return (T) obj;
}

使用此方法,您可以编写:

loadFile = castToAnything(in.readObject());
于 2011-04-12T07:09:49.443 回答
0

这意味着编译器无法检查您读入的对象是否与您将其转换为的类型匹配。因此,未经检查的警告。

顺便说一句:您可能希望处理错误以使其更简单、更清晰。;)

于 2011-04-12T07:07:28.650 回答
0

您看到的是一个编译器警告,您正在尝试将 Object 转换为 aArrayList<Dot>而没有首先检查该 Object 是否实际包含 Dot 列表而不是例如 Foo 列表。

于 2011-04-12T07:08:12.580 回答