为什么以下“substring”调用失败?

时间:2013-09-02 05:48:47

标签: java

class strb1
{
    static public void main(String a_[])
    {  
         StringBuilder sb = new StringBuilder("Test");
         StringBuilder sb1;
         sb1 = sb.append("ing").append("a").substring(0); //Line 1
         System.out.println(sb);
         System.out.println(sb1); 
    }   
}

这个程序在第1行给出了编译器错误。substring是StringBuilder类中的一个有效方法,所以我不确定我在这里缺少什么。有人能指出我的错误吗?

6 个答案:

答案 0 :(得分:15)

substring确实是一种有效的方法 - 但它会返回String引用,而不是StringBuilder,因此您无法将返回值分配给sb1 。这应该有效:

String x = sb.append("ing").append("a").substring(0);

但是,您应该退后一步,再次查看错误消息。确保你理解它的每一部分,并问自己为什么没有足够的信息来自己诊断问题。这种自我评估应该帮助您在不咨询社区的情况下诊断未来的问题。 (我相信很多人都很乐意提供帮助,但如果你能自己解决这个问题,对每个人来说都会更有效率。)

这里有一个有用的技巧是尽可能减少问题的范围 - 所以我可能首先将它隔离到单个方法调用:

sb.append("ing").append("a");
sb1 = sb.substring(0);

此时,当第二行标记错误时,不需要考虑。错误类似于:

Test.java:11: error: incompatible types
    sb1 = sb.substring(0);
                      ^
  required: StringBuilder
  found:    String
1 error

现在无可否认,这不是世界上最清晰的错误消息,但鉴于没有在该声明中使用String有< / em>是方法的返回值 - 您的文档也应该检查当然。

答案 1 :(得分:5)

substring(0)返回String,您正尝试将其分配给StringBuilder

答案 2 :(得分:1)

StringBuilder#substring(int)声明为:

public String substring(int start)

不是StringBuilder。您需要从您获得的String中创建一个新的StringBuilder,或者将sb1的类型更改为String,在这种情况下,为了清楚起见,我还要重命名它,因为名为sb的字符串可以假定为{ {1}}。

答案 3 :(得分:1)

substring会返回String,但您尝试将其存储在StringBuilder

答案 4 :(得分:0)

添加:

您也可以使用new StringBuilder()

sb1=new StringBuilder(sb.append("ing").append("a").substring(0)); // Line 1

答案 5 :(得分:0)

替换

sb1 = sb.append("ing").append("a").substring(0);

sb1 = sb.append("ing").append("a");