Java 未经检查的案例警告

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

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

它不是“没有捕获”,而是“未经检查”。 JVM无法在运行时告知,即在完成转换时,ArrayList是否真的包含Dot元素。

从原始类型转换为generics类型时,会发生此警告。 如果您确定演员阵容没问题,则可以使用注释来抑制警告

 @SuppressWarnings("unchecked") 

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

您没有检查返回的对象是否

 in.readObject(); 

真的是一个

 ArrayList 

使用

 ArrayList dotList = null; Object obj = in.readObject(); if (obj instanceof ArrayList) { dotList = (ArrayList) obj; } 

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

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

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

 loadFile = castToAnything(in.readObject()); 

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

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

您看到的是编译器警告您正在尝试将Object转换为ArrayList而不首先检查Object是否实际包含Dot列表而不是例如Foo列表。