Java 方法程序+;转换
我的一段代码(上面)有问题,为什么没有初始化Java 方法程序+;转换,java,switch-statement,Java,Switch Statement,我的一段代码(上面)有问题,为什么没有初始化r,还有什么可以做得更好?r没有初始化,因为 声明时没有=,并且 有一个从双r到返回r的代码路径(即,当开关采用默认:分支时),该路径不分配r任何值 有几种方法可以修复它-一种是用初始值声明r,如下所示: static double rSetzen(){ double r; System.out.println("Sind sie männlich oder weiblich?"); String gender = new
r
,还有什么可以做得更好?r
没有初始化,因为
- 声明时没有
,并且=
- 有一个从
到双r
的代码路径(即,当返回r
采用开关
分支时),该路径不分配默认:
任何值r
r
,如下所示:
static double rSetzen(){
double r;
System.out.println("Sind sie männlich oder weiblich?");
String gender = new java.util.Scanner(System.in).nextLine();
switch(gender){
case "männlich": r = 0.7; break;
case "weiblich": r = 0.6;break;
default: System.err.println("Dies war nicht gefragt"); rSetzen();break;
}
return r;
}
另一个是确保默认值:
分支分配r
一些值:
double r = 0;
另一种方法是在默认值中抛出异常:
default:
System.err.println("Dies war nicht gefragt");
r = rSetzen();
break;
这将阻止代码到达返回r
我只是想知道我能做得更好
一个更好的方法是使用循环而不是递归来解决一个本质上不是递归的问题。递归时不返回
default:
throw new IllegalStateException("Dies war nicht gefragt");
break;
一个可能的改进是,假设用户不是“weiblich”,那么他们一定是“männlich”
您可以将默认分支中对rSetzen()的调用改为一个
return rSetzen()
。当只执行默认值时会发生什么情况,也就是说,没有其他情况?我想它会重新启动,这不是叫递归吗?谢谢。我(整晚都在思考)很想知道递归到底是如何工作的:@Methredel这不是递归的好例子,因为目前它是在最终用户键入“männlich”
或“weiblich”
和系统耗尽堆栈空间之间的竞争,以先发生的为准。一个do
/while
循环可以让你的程序永远持续下去,但是递归的深度受到堆栈的限制。我只想在我的代码中得到一个“是/否”问题(一个只有两个可能答案的问题),因为我写了一个程序,在一种情况下需要变量r=0.7;在另一种情况下,r=0.6。它用于一种特殊的化学配方。
switch(gender){
case "männlich": r = 0.7; break;
case "weiblich": r = 0.6;break;
default: System.err.println("Dies war nicht gefragt"); return rSetzen();
}
// This will test for equality, and consider "Weiblich" (note capitalization)
// as equal.
if (gender.equalsIgnoreCase("weiblich")) {
return 0.6;
}
return 0.7;