我正在编写一种方法来查找给定字符串中的大写字母。我有这个
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的子串时它告诉我它返回的字符串是另一个字符串的子集...这意味着我返回一个字符串,对吧?我被告知这是因为我在循环中返回一个字符串并且这不是一回事但我对这意味着什么感到困惑,因为这不是方法中的循环?有谁知道我做错了什么或我怎么解决这个问题?
答案 0 :(得分:4)
不,你并不总是返回一个字符串。如果输入完全是小写的话怎么办?
基本上,在 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
}
非空方法的结束无法访问 - 您必须抛出异常或返回值。
另请注意,您的初始值应为x.length() - 1
或x.charAt(i)
会引发异常。您还应该更改方法名称以遵循Java命名约定。
哦,目前你还没有回来"大写字母" - 你从最后一个大写字符开始返回"所有内容"这是完全不同的。
答案 1 :(得分: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
答案 2 :(得分:1)
考虑给定字符串中没有大写的情况,在这种情况下,函数不会返回任何内容。
所以在你的for
循环之后,你可以返回一个空字符串,使函数声明有效。
答案 3 :(得分: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 "";
}
答案 4 :(得分:1)
您的问题是,您在if语句中返回字符串dependend。您必须在每种可能的情况下返回一个字符串或null。只需在函数的最后一行放置return null
或返回""
即可获得快速而肮脏的解决方案。如果没有找到大写字符,最好考虑你要返回的内容。