-2

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

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 时,它告诉我它返回的字符串是另一个字符串的子集……这意味着我正在返回一个字符串,对吗?有人告诉我这是因为我在循环中返回了一个字符串,这不是一回事,但我对这意味着什么有点困惑,因为方法中不是循环吗?有谁知道我做错了什么或如何解决这个问题?

4

5 回答 5

4

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

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

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 命名约定。

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

于 2013-10-05T18:39:43.640 回答
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

于 2013-10-05T18:40:03.803 回答
1

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

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

于 2013-10-05T18:40:32.953 回答
1

因为只有当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 "";
}
于 2013-10-05T18:40:52.663 回答
1

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

于 2013-10-05T18:41:30.593 回答