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 中的不可达语句的主要内容,如果未能解决你的问题,请参考以下文章

java 8 不可达语句 switch case 语句

复杂的条件和不可达的语句

Javacc 不可达语句

Java的内存回收

RabbitMQ中的消息不可达returnlistener和mandatory的使用

Java对象在内存中的状态