2012-08-05 95 views
4

喜检查下面的代码字符串缓冲区字符串转换异常?

ArrayList x=new ArrayList(); 
    ArrayList<String>y=x; 
    ArrayList<StringBuffer>z=x; 
    y.add("Strings"); 
    System.out.println(z.get(0).toString()); 

正在逐渐类转换异常时的System.out.println

java.lang.ClassCastException: java.lang.String 
at com.one.MainClass.main(MainClass.java:16) 

但是,当我试图

System.out.println(z.get(0)) 

,它正在 为什么来了??

+2

你想达到什么目的? – AlanFoster 2012-08-05 15:42:17

+0

请不要在使用StringBuilder时使用StringBuffer。 – 2012-08-13 07:58:12

回答

1

的细节,为什么你得到你的问题是这样的:

  • 新的ArrayList创建,空
  • 所有元素类型为String y中
  • 所有元素都输入到的StringBuffer在z
  • 将新元素添加到此数组列表中。
  • JVM尝试将其转换为BOTH字符串和StringBuffer
  • 由于“字符串”不是StringBuffer的实例,因此抛出了ClassCastException。

为了避免这种情况,请不要为String和StringBuffer类型输入数组。只选择一个。例如:

ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer> 

如果你想为一个字符串数组列表复制到一个StringBuffer ArrayList中,你必须遍历所有Z中的项目将它们转换为字符串缓冲区:

ArrayList x=new ArrayList(); 
ArrayList<String>y=x; 
ArrayList<StringBuffer>z=new ArrayList<StringBuffer>(); 
for(String s : y) 
    z.add(new StringBuffer(s)); 

原因是StringBuffer没有扩展String。造成问题的原因是您无法投射字符串,比如说“str”指向StringBuffer,即您无法执行StringBuffer s = (StringBuffer)"str";

要将ArrayList x投射到ArrayList<T>,所有x元素必须扩展或成为T的实例。

另外,您应该尽可能使用泛型类型。如果你不知道会是什么(例如)在列表中,使用方法:

ArrayList<?> x = new ArrayList<?>(); 

如果你知道更多一点,比如,这将是另一个类的子类,使用 ArrayList<? extends T>ArrayList<? implements T>。这将帮助您避免将来的ClassCastExceptions。

2

我假设你正在做这个实验(如果没有,那么请阅读关于你应该如何编写代码的其他答案)。

x是一个原始的ArrayList,您可以在其中放置任何类型的对象。

y.add("string")增加了一个字符串。

z是ArrayList<StringBuffer>并且期望StringBuffers。当您调用z.get(0)时,JVM尝试将索引为0的元素转换为StringBuffer,然后再返回。该投射失败。

换句话说,虽然StringBuffer s = z.get(0);编译,它会在运行时抛出一个ClassCastException,因为z.get(0)不是StringBuffer

相关问题