2014-01-14 29 views
2

初学Java编码器在这里。这里的代码:未经检查的演员 - 我应该压制这个吗?

private ArrayList<Rectangle> rectangles; 
try { 
     InputStream IS = MyClass.class.getResourceAsStream("file.dat"); 
     ObjectInputStream input = new ObjectInputStream(IS); 
     rectangles = (ArrayList<Rectangle>) input.readObject(); 
} catch (IOException | ClassNotFoundException ex) { 
     System.out.println(ex); 
} 

Netbeans告诉我,这是一个未经检查的演员。谷歌告诉我,我应该尽量避免这个警告,而不是压制它,那么我该如何去做呢?这个程序应该读取的唯一文件确实包含一个ArrayList,如果没有,我很好,只是捕获这些异常。此外,如果我对char [] [](从OIS读取并尝试投射)执行相同操作,netbeans不会有任何问题。这是为什么?我认为这仍然是一个不受控制的演员。

回答

2

如果你知道为什么它在那里,你应该只禁止警告。在这种情况下,因为它听起来像你理解这个问题,并正在采取措施来处理它,然后抑制它可能是好的。但是,如果你是在做警告走背水战,唯一的方法我发现这样做,在这种情况下是做这样的事情:

public class ListOfRectangles extends ArrayList<Rectangle> {} 

然后用ListOfRectangles为您的数据类型序列化往返于该文件。

编译器与char [] []合适而不是ArrayList<Rectangle>的原因是因为Java泛型称为擦除的概念。这意味着对于泛型类型(如ArrayList),参数化类型(本例中为Rectangle)实际上不在字节码中。它只在编译期间出现,因此编译器可以仔细检查你的工作。数组并非如此。

有一个更深入了解泛型here

1

有时,避免演员阵容根本不可能或太难。通过任何方式尽量避免总是分配检查类型。但是,如果你不能,那么只是压制它。恕我直言。

在这种情况下看起来完全合法的压制它。这比返回Object要好。

1

总是试图避免这个警告,而不是压制它,这样可以降低运行时错误的几率。

+0

运行时错误是受到检查或未检查转换的危险。唯一的区别是该错误的确切位置。 –

1

,如果不能避免,如果可能的话,文件。下面是乔希布洛赫建议记录的方式(有效的Java,第二版,第26项):不是全功能

private ArrayList<Rectangle> rectangles; 
try { 
     InputStream IS = MyClass.class.getResourceAsStream("file.dat"); 
     ObjectInputStream input = new ObjectInputStream(IS); 

     //The input stream is definitely an ArrayList<Rectangle> 
     //I know this because............... 
     @SuppressWarnings("unchecked") 
     ArrayList<Rectangle> rectangles2 = (ArrayList<Rectangle>) input.readObject(); 
     rectangles = rectangles2; 

} catch (IOException | ClassNotFoundException ex) { 
     System.out.println(ex); 
} 

这本地化的抑制来的几行代码。

+0

假设你有修复的错误。你会相信一个评论,然后走开吗?如果你的答案是“是”,那么你不能完成调试任务。换句话说,忘记评论。 –

+1

它最好是一个该死的好和有用的评论,否则它*不*值得信赖。如果它没有帮助调试,它不应该在那里。 – aliteralmind

+0

评论和代码有他们自己独立的生活。我是否应该去挖掘git历史记录来首先追踪添加注释的原始提交,然后通过任何修改来决定每个修改是否保留注释中解释的属性?没办法,我花时间亲自检查代码的功能。事实上,需要练习才能学会如何彻底和完全忽略**评论,以便在阅读代码时引导你误入歧途。这对我来说是一种伤害。 –

0

抑制警告可能是合法的。例如,如果您完全确信序列化格式,则可以将其抑制。但是,如果您不确定,因为其他人制作了序列化格式,或者您认为格式可能会随着时间的推移而演变,您可以在不执行任何不安全转换的情况下验证内容。

List<?> untyped = (List<?>) input.readObject(); 
List<Rectangle> rectangles = new ArrayList<>(untyped.size()); 
for (Object obj : untyped) 
    rectangles.add((Rectangle) obj); 

这将确保如果一个元素是不是Rectangle,所产生的ClassCastException将立即某处后抛出,在显式转换的网站,而不是,在执行没有明显蒙上了点。

相关问题