【发布时间】:2022-01-04 10:32:30
【问题描述】:
以下代码编译失败,因为变量 'rt' 尚未初始化。
我希望代码在 switch 语句中初始化“rt”,或者在运行默认情况时不再使用“rt”。
这是我写的代码:
enum RequestType {leader, candidate};
private void processRequest(String input) {
boolean inputOK = true;
RequestType rt;
String[] split = input.split(":");
if (!input.contains(":")) {
inputOK = false;
}
else {
if (split.length != 3) {
inputOK = false;
}
else {
int port = Integer.parseInt(split[2]);
if (!(port > 0 && port < 65537)) {
inputOK = false;
}
else {
switch (split[0]) {
case "Leader":
rt = RequestType.leader;
break;
case "Candidate":
rt = RequestType.candidate;
break;
default:
inputOK = false;
}
}
}
}
if (!inputOK) {
return;
}
String address = split[1].concat(split[2]);
if (rt == RequestType.leader) {
keepingLeader(address);
}
【问题讨论】:
-
您不会在默认块或许多 ifs 中初始化
rt。编译器不看rt的读取相对于inputOK的值是否可达,它只看它是否完全可达。 -
是的,但我将 false 分配给 requestOK,这将导致 rt 不再被使用。编辑:好的,这解释了它。我怎么能在这里处理这个,因为我真的没有一个默认值来分配给 rt
-
局部变量没有默认值,所以你不能使用它们(例如在比较时)除非先显式初始化它们,即使使用
null。 -
或者,不要使用单独的
inputOK变量,而是使用rt == null来指示输入不正确。
标签: java initialization switch-statement return