【问题标题】:Am I not returning a string? [duplicate]我没有返回一个字符串吗? [复制]
【发布时间】:2013-10-12 15:18:50
【问题描述】:

我正在编写一种方法来查找给定字符串中的大写字母。我有这个

public static String FindUpperCase (String x){
 for (int i = x.length(); i>=0; i--){
      if (Character.isUpperCase(x.charAt(i))){
          return x.substring(i); }
    }

但是我收到一个错误,告诉我必须返回一个字符串。当我查看 API 时,它告诉我它返回的字符串是另一个字符串的子集……这意味着我正在返回一个字符串,对吗?有人告诉我这是因为我在循环中返回了一个字符串,这不是一回事,但我对这意味着什么有点困惑,因为方法中不是循环吗?有谁知道我做错了什么或如何解决这个问题?

【问题讨论】:

  • 这是在抱怨,因为如果 if 语句始终计算为 false,您还没有返回字符串。
  • 您的代码只有在进入 IF 条件时才会返回一个字符串。如果 IF 从未执行过怎么办?
  • “查找大写字母”是指“第一个大写字母之后的字符串部分”吗?
  • 所有执行路径必须返回一个字符串。
  • 我想知道为什么反对这个问题,只是为了清楚

标签: java string if-statement for-loop return


【解决方案1】:

不,您并不总是返回一个字符串。如果输入完全是小写怎么办?

基本上,您需要一个return 语句(或抛出异常) for 循环之后,以处理您到达它结束的情况。即使在可以推断你永远不会真正到达循环末尾的情况下,Java 编译器也会遵循严格的可达性规则,如section 14.21 of the JLS 中所指定。因此,即使您的 return 语句是无条件的并且 我们 知道 length() 总是返回一个非负值,这仍然无法编译:

public static String broken(String input) {
    // *We* know that we'll always go into the body of the loop...
    for (int x = input.length(); x >= 0; x--) {
        return input;
    }
    // The end of the method is still reachable from the compiler's standpoint
}

无法到达非 void 方法的结尾 - 您必须要么抛出异常,要么返回值。

还请注意,您的初始值应为x.length() - 1x.charAt(i) 将引发异常。您还应该更改方法名称以遵循 Java 命名约定。

哦,目前您没有返回“大写字母” - 您返回的是“从最后一个大写字符开始的所有内容”,这是完全不同的。

【讨论】:

  • 什么!不!在 for 循环之后你需要一个 return ''
  • 这么快,我最终删除了我的答案。
  • @Brian WUT? '' 不是 String
  • @Brian:你需要一些return声明或throw声明。没有迹象表明它应该返回一个空字符串(即使应该返回,return ''; 也是无效的 Java)。
【解决方案2】:

您要根据条件返回,因此如果条件永远不是true,则您不会返回。试试吧。

public static String FindUpperCase (String x){
    for (int i = x.length() - 1; i>=0; i--){
        if (Character.isUpperCase(x.charAt(i))){
            return x.substring(i); }
    return "";
}

Java 也是从 0 开始的索引,因此您的 for 句子从 x.length() - 1(最后一个位置)开始,否则您将得到 StringIndexOutOfBoundsException

【讨论】:

    【解决方案3】:

    考虑给定字符串中没有大写字母的情况,在这种情况下,函数不会返回任何内容。

    因此,在您的for 循环之后,您可以返回一个空字符串以使函数声明有效。

    【讨论】:

      【解决方案4】:

      因为只有当Character.isUpperCase(x.charAt(i)) 为真时才会返回字符串。如果它是假的,你必须返回例如空字符串。

      public static String FindUpperCase (String x){
         for (int i = x.length(); i>=0; i--){
            if (Character.isUpperCase(x.charAt(i))){
               return x.substring(i); }
         }
         return "";
      }
      

      【讨论】:

        【解决方案5】:

        您的问题是,您返回的字符串依赖于 if 语句。在每种可能的情况下,您都必须返回一个字符串或 null。只需在函数的最后一行放置 return null 或返回 "" 即可获得快速而肮脏的解决方案。如果没有找到大写字符,最好考虑一下要返回的内容。

        【讨论】:

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