繁体   English   中英

Java中无法访问的语句

[英]Unreachable Statement in Java

我正在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;处出现了编译器错误return director; 那是无法达成的声明。 我不明白这是从哪里来的,看起来都不错,有人可以帮我吗?

在此先感谢xx

问题在这里:

public String seeDVDInfo() {
    return filmName;
    return director;
    return leadActor;
}
  • Java方法中不能有多个return语句。
  • 一旦return filmName; ,其他语句无法执行,因此会引发Unreachable Statement错误。

请参阅此线程以了解为什么Unreachable Statement是Java中的错误。

如果这确实是您代码中的方法:

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;
    }
}

您遇到错误-第一个return代码将运行并返回filmName的值, filmName退出该方法,因此无法实现其他返回调用。

一个方法只能返回一个对象。 您可以使用复杂的对象来保存一些数据并将其返回。

我建议您创建DvdInfo类:

public class DvdInfo {
    String filmName;
    String director;
    String leadActor;
// getters & setters...
}

并将其用作返回类型:

public DvdInfoseeDVDInfo() {
    new DvdInfo(filmName, director, leadActor);
}

seeDVDInfo方法中的第一条语句“ return filmName”返回filmName变量并退出seeDVDInfo方法...因此,其他2条语句将永远不会运行。 因此,返回导演和返回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

这是因为一旦从方法中返回,则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语句中的条件表达式为常量“ false”,我们也不会出错。 为了给开发人员提供便利,对它进行了特殊处理。 开发人员可以在if语句中使用标志变量,并将默认最终值设置为false或true。 只需通过将flag变量从false更改为true即可,反之亦然,开发人员可以重新编译该程序并以不同的方式使用它。

方案3:

public void helloWorld() {
   System.out.println("HelloWorld");
 while(true) {
      return;
  }
  System.out.println("World");
}

如上所述,这会产生无法访问的异​​常编译错误。

一个方法中不能有多个返回,这就是为什么返回后的下一行不可访问的原因

  public String seeDVDInfo() {
    return filmName;
    //return director; 
    //return leadActor;
}

您正在尝试返回三个字符串->失败。

使用此代替:

public List<String> seeDVDInfo() {
    List<String> dvdInfos = new ArrayList<>();
    dvdInfos.add(filmName);
    dvdInfos.add(director);
    dvdInfos.add(leadActor);
    return dvdInfos;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM