Java 为什么它会给我一个返回丢失的错误?
为什么这个方法总是告诉我它缺少返回语句?如果我删除了else,它会告诉我返回true是不可访问的。提前感谢您的帮助Java 为什么它会给我一个返回丢失的错误?,java,unreachable-statement,Java,Unreachable Statement,为什么这个方法总是告诉我它缺少返回语句?如果我删除了else,它会告诉我返回true是不可访问的。提前感谢您的帮助 public static boolean Digit(String pass){ for (int i=0; i < pass.length(); i++ ){ if (!Character.isDigit(pass.charAt(i))) { System.out.println("Mus
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
else
return true;
}
}
公共静态布尔数字(字符串传递){
对于(int i=0;i
为什么这个方法总是告诉我它缺少返回语句
因为有一种方法可以到达for
循环之后的点。考虑< <代码>传递>代码>长度为零的情况。
更一般地说,用于确定语句(或代码中的点)的可访问性的规则如中所述。简单的for
循环的相关规则如下:
当且仅当以下至少一项为真时,for的基本语句才能正常完成:
for
语句是可访问的,有一个条件表达式,条件表达式不是值为true的常量表达式(§15.29)
- 有一个可到达的break语句退出
for
语句
在您的示例中,满足了第一个要求。因此,
的循环可以正常完成。因此,在for
循环之后有一个返回点。因此,此时需要一个return
语句
请注意,可达性规则并不依赖于Java编译器是否足够聪明来分析应用程序的逻辑,而且它们也没有赋予编译器足够聪明的自由裁量权。因此,有一些Java示例可以正式证明语句是不可访问的,但是规则说它是可访问的,并规定编译错误
(因此,在您的示例中,编译器不需要推理您的代码不考虑零长度字符串。这是“人类级别”的推理。)它抱怨,因为您在循环结束时缺少返回。您的方法可以在三种不同的情况下退出,即:
当字符串pass
不为空且第一个字符不为空时
一个数字李>
当字符串pass
不为空且第一个字符为数字时李>
当字符串为空时强>
代码:
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false; // <--- can exit here
}
else
return true; // <-- can exit here
}
// <-- can exit here if the string pass is empty
}
它编译得很好,即使循环结束时没有返回语句。为什么?因为基于上述规则,我的循环无法正常完成,因为它的条件表达式是true
,所以可以找到关于它的更多详细信息。公平地说,在我的IDE中,当我添加了您的代码后,我立即得到警告,'for'语句没有循环
总之,对于您的案例,您需要涵盖这三个场景,并且在循环的末尾有一个return语句,您可以阅读更多关于或使用@Stephen C answer的内容,它可以很好地将其分解
除此之外,你的方法不是做你想做的事。您只比较字符串的第一个数字,但应检查整个字符串,如:
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
}
return !pass.isEmpty();
}
谢谢你打字!我只是忘了把线圈的brackets@MohSameh嗨,你介意接受一个答案吗:)?
public static boolean Digit(String pass){
if(pass.isEmpty())
return false;
for (int i = 0; true; i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
else
return true;
}
}
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
}
return !pass.isEmpty();
}
public static boolean isDigit(String pass){
return !pass.isEmpty() && pass.chars().allMatch(Character::isDigit);
}