【问题标题】:Palindrome Program output out of range [duplicate]回文程序输出超出范围[重复]
【发布时间】:2014-03-28 14:48:48
【问题描述】:

我对编程很陌生。你能告诉我为什么会这样输出吗:

字符串索引超出范围:-1

class Palindrome {

    public static String reverse(String s) {
        if (s == "") {
            return s;
        }
        else {
            return reverse(s.substring(1,s.length())) + s.charAt(0);
        }
    }

    public static void main(String args[]) {
        System.out.print(reverse("galskjdf"));
    }
}   

【问题讨论】:

  • @ZouZou 此代码中没有字符串比较,只有子字符串,我看不出这个问题如何适用
  • @Absurd-Mind if (s == "") 怎么样?
  • 大声笑,没有一天没有这个重复 :-) 我几乎不知道 Java,但对我来说这似乎是一个设计缺陷,虽然我明白为什么这么多人喜欢这个是不正常的。跨度>
  • @Bartdude 这不是设计缺陷。人们在编程之前需要了解基本的 Java,就像在处理 C 和变体时应该了解指针一样。
  • @turbo endIndex 是专有的。所以s.length() 是有效的。

标签: java


【解决方案1】:

使用

class Palindrome {
  public static String reverse(String s) {
    if ("".equals(s)) {
      return s;
    } else {
      return reverse(s.substring(1,s.length())) + s.charAt(0);
  }
}

  public static void main(String args[]) {
    System.out.print(reverse("galskjdf"));
  }
}   

请参阅How do I compare strings in Java?Reverse a string in Java 也可能会有所帮助(即使您可能将上述代码作为编程练习,但知道通常人们会使用现有工具来处理这类事情并没有什么坏处) .

使用原因

"".equals(s)

而不是

s.equals("")

如下:如果snull,则后者将抛出NullPointerException(因为您尝试在null上调用方法),而前者在您调用方法时仍然有效一个“正确的”字符串,另见Gracefully avoiding NullPointerException in Java 但是,我记得也有人批评这种方法,因为这可能会让你错过s 不应该是null 的事实(在这种情况下,你应该明确检查处理这种情况)。

【讨论】:

  • "".equals(s) 最好避免可能的 NPE
  • @turbo,谢谢,你说得对,我已经添加了
【解决方案2】:

因为您以错误的方式进行字符串比较 => 递归不会在有效点停止。替换这个:

s == ""

用这个:

"".equals(s)

编辑好吧,看来需要证明,这里是:http://ideone.com/TWm5U8

【讨论】:

  • 虽然这不是不正确的,但这并不能回答问题;错误消息不是来自这个...
  • @Bartdude 好吧,我尝试对给定的代码进行更正,它有效;)
  • @Bartdude 你错了,证明ideone.com/TWm5U8
  • @Bartdude 这不是错误的来源,但它会导致无效的字符串到达​​ else 语句
  • @turbo 为什么你认为这不是错误的根源? =)
【解决方案3】:

使用这个功能:

public static String reverse(String s) {
    if (s == null || s.length() <= 1) {
        return s;
    } else {
        return reverse(s.substring(1)) + s.charAt(0);
    }
}

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2020-04-21
    • 2021-03-28
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多