1
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 类中的一个有效方法,所以我不确定我在这里缺少什么。有人可以指出我出了什么问题吗?

4

6 回答 6

15

substring确实是一个有效的方法 - 但它返回一个String引用,而不是 a 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

于 2013-09-02T05:50:12.333 回答
5

substring(0)返回 aString并且您试图将其分配给 a StringBuilder

于 2013-09-02T05:50:07.037 回答
1

StringBuilder#substring(int)声明为:

public String substring(int start)

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

于 2013-09-02T05:50:28.663 回答
1

substring返回String,但您正试图将其存储在StringBuilder

于 2013-09-02T05:52:11.233 回答
0

代替

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

sb1 = sb.append("ing").append("a");
于 2013-09-02T06:06:44.077 回答
0

补充:

你也可以使用new StringBuilder()

sb1=new StringBuilder(sb.append("ing").append("a").substring(0)); // Line 1
于 2013-09-02T06:00:07.210 回答