【问题标题】:String Buffer To String Conversion Exception?字符串缓冲区到字符串转换异常?
【发布时间】:2012-08-02 19:15:02
【问题描述】:

您好,请查看以下代码

   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 处出现 Class Cast 异常

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

但是当我尝试的时候

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

它正在工作 为什么会这样??

【问题讨论】:

  • 你想达到什么目的?
  • 可以使用StringBuilder时请不要使用StringBuffer。

标签: java arraylist stringbuffer


【解决方案1】:

我假设您这样做是为了进行实验(如果没有,请阅读其他答案,了解您应该如何编写代码)。

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

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

z 是一个 ArrayList&lt;StringBuffer&gt; 并且需要 StringBuffers。当您调用z.get(0) 时,JVM 会在返回之前尝试将索引 0 处的元素转换为 StringBuffer。那个演员失败了。

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

【讨论】:

    【解决方案2】:

    您遇到问题的具体原因如下:

    • 新的 ArrayList 已创建,为空
    • 所有元素都被键入到 String in y
    • 所有元素都输入到 z 中的 StringBuffer
    • 一个新元素被添加到这个数组列表中。
    • JVM 尝试将其强制转换为 String 和 StringBuffer
    • 因为“Strings”不是StringBuffer的实例,所以抛出ClassCastException。

    为避免这种情况,请不要同时为 String 和 StringBuffer 键入数组。只选择一个。例如:

    ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer>
    

    如果你想将一个字符串数组列表复制到一个字符串缓冲区数组列表中,你必须遍历 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。导致问题的原因是您无法将字符串转换为 StringBuffer,即您无法执行 StringBuffer s = (StringBuffer)"str";

    要将ArrayList x 转换为ArrayList&lt;T&gt;x 的所有元素都必须是 T 的扩展或实例。

    此外,您应该尽可能使用泛型类型。如果您不知道列表中的内容(例如),请使用:

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

    如果您知道的更多,例如它将是另一个类的子类,请使用 ArrayList&lt;? extends T&gt;ArrayList&lt;? implements T&gt;。这将帮助您避免未来的 ClassCastExceptions。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多