Java 中的不可达语句
Posted
技术标签:
【中文标题】Java 中的不可达语句【英文标题】:Unreachable Statement in Java 【发布时间】:2013-10-18 03:31:07 【问题描述】:我正在为我的大学课程在 BlueJ 工作,我被设置了一项基本任务,我们需要用户输入有关 DVD 的某些信息,例如导演、姓名、运行时间等。
我正在使用 Java 进行编码,并且也使用过 Genio。以下代码是我如何获取和设置变量中的信息;
public void getDVDInfo()
//Ask for info
System.out.println("Please Enter the Film Info:");
System.out.println("Film Name: ");
System.out.println("Film Director: ");
System.out.println("Lead Actor/Actress: ");
System.out.println("Running Time: ");
public void setDVDInfo()
//set user input to variables
filmName = Genio.getString();
director = Genio.getString();
leadActor = Genio.getString();
runTime = Genio.getInteger();
这一切都根据我在 BlueJ 中使用的编译器工作,但是当我编写函数以将信息返回给用户时,就像这样;
public String seeDVDInfo()
return filmName;
return director;
return leadActor;
public int seeRunTime()
return runTime;
它在return director;
出现编译器错误,这是一个无法访问的语句。我不明白这是从哪里来的,看起来一切正常,有人可以帮帮我吗?
提前谢谢xx
【问题讨论】:
您正试图从seeDVDInfo
返回三个值。你不能那样做。你希望调用者得到什么?你希望什么时候控制权返回给调用者? (基本上,第一个 return
语句完成了该方法 - 所以你永远不会到达你的第二个或第三个 return
语句。)
可能会有所帮助:docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html
【参考方案1】:
问题来了:
public String seeDVDInfo()
return filmName;
return director;
return leadActor;
Java 方法中不能有多个 return 语句。
一旦你return filmName;
,其他语句就无法执行,所以抛出Unreachable Statement错误。
查看此thread 了解为什么 Unreachable Statement 在 Java 中是一个错误。
【讨论】:
我想我们可以在一个方法中有多个条件返回语句 @upog,是的,这是可能的。【参考方案2】:如果这确实是您代码中的方法:
public String seeDVDInfo()
return filmName;
return director;
return leadActor;
然后,问题是一个方法用 return 语句结束。它将使用提供的值退出方法。
您有不同的方法来解决问题,具体取决于您要提供/使用的信息:
public String seeDirector()
return director;
public String seeFilmName()
return director;
public String leadActor()
return director;
考虑到 java 是一种 OOP 语言,我建议创建一个类 Film
包含/封装可以返回的信息。所以实际上它看起来像这样:
public class Film
private String director;
private String filmName;
private String leadActor;
public Film(String director, String filmName, String leadActor)
this.director = director;
this.filmName = filmName;
this.leadActor = leadActor;
public String getFilmName()
return filmName;
public void setFilmName(String filmName)
this.filmName = filmName;
public String getDirector()
return director;
public void setDirector(String director)
this.director = director;
public String getLeadActor()
return leadActor;
public void setLeadActor(String leadActor)
this.leadActor = leadActor;
【讨论】:
【参考方案3】:您有一个错误 - 第一个 return
代码将运行并返回 filmName
的值,退出该方法,因此无法到达其他返回调用。
一个方法只能返回一个对象。您可以使用一个复杂的对象来保存一些数据并返回它。
我建议你创建 DvdInfo 类:
public class DvdInfo
String filmName;
String director;
String leadActor;
// getters & setters...
并将其用作返回类型:
public DvdInfoseeDVDInfo()
new DvdInfo(filmName, director, leadActor);
【讨论】:
第二个技巧真的很有帮助,甚至是一个字符串容器这样的列表。 非常感谢 - 这确实有效,但是对于我们在一个大班上完成的作业 - 不过谢谢! @sᴜʀᴇsʜ ᴀᴛᴛᴀ list 不是一个好的选择,因为您需要记住订单并且无法轻松验证数据。使用 POJO 保存数据是一种更好的方法【参考方案4】:seeDVDInfo 方法中的第一条语句“return filmName”返回filmName 变量并退出seeDVDInfo 方法...因此,其他两条语句将永远不会运行。因此,return director 和 return leadActor 是“无法访问”的......
public String seeDVDInfo()
return filmName;
return director;
return leadActor;
来自 Java 教程:
A method returns to the code that invoked it when it completes all the statements in the method, reaches a return statement, or throws an exception (covered later), whichever occurs first.
http://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html
【讨论】:
【参考方案5】:这是因为一旦从方法中返回,return 语句后留下的任何代码都将无法访问,因此无法编译。
在这里,我将尝试用 3 个场景向您解释。
场景 1: 对于代码,
public void helloWorld()
System.out.println("Hello");
return;
System.out.println("World");
标记为粗体的 Prited Line 不会编译。
场景 2:
public void helloWorld()
System.out.println("Hello");
if(true)
return;
System.out.println("World");
这编译成功。 这些规则中最一般的逻辑是,如果条件表达式决定它的计算结果为 false,那么被块包围的代码是不可达的,然后该块被决定为不可达。然后就变成了错误。
仅对于“if”构造,规则是不同的。条件表达式不被评估和决定。无论 if 条件中的表达式是什么,都不会对其进行评估以决定代码块是否可访问,因此即使我们在 if 语句中将常量值“false”作为条件表达式,我们也不会出错。这被特殊对待,以便为开发人员提供便利。开发人员可以在 if 语句中使用标志变量,默认最终值为 false 或 true。只需将 flag 变量从 false 更改为 true 或反之,开发人员就可以重新编译程序并以不同的方式使用它。
场景 3:
public void helloWorld()
System.out.println("HelloWorld");
while(true)
return;
System.out.println("World");
这会导致无法访问的异常编译错误,如上所述。
【讨论】:
【参考方案6】:你不能在一个方法中有多个返回,这就是为什么返回后的下一行无法访问
public String seeDVDInfo()
return filmName;
//return director;
//return leadActor;
【讨论】:
【参考方案7】:你试图返回三个字符串 -> 失败了。
改用这个:
public List<String> seeDVDInfo()
List<String> dvdInfos = new ArrayList<>();
dvdInfos.add(filmName);
dvdInfos.add(director);
dvdInfos.add(leadActor);
return dvdInfos;
【讨论】:
以上是关于Java 中的不可达语句的主要内容,如果未能解决你的问题,请参考以下文章