【问题标题】:Unreachable Statement in JavaJava 中的不可达语句
【发布时间】: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 语句。)

标签: java bluej unreachable-statement


【解决方案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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-01
            • 2013-09-27
            • 1970-01-01
            • 2013-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-06
            相关资源
            最近更新 更多