【问题标题】:Unreachable Statement with Break带中断的无法访问的语句
【发布时间】:2013-12-08 01:26:40
【问题描述】:

所以我有一个先前的问题,但意识到我发布了错误的违规代码。我已经在下面标记了冒犯性的陈述。

我要做的是使用该 switch 语句为每个运算符设置优先级。

也许有人可以为我指明正确的方向。

请注意,我正在运行 JAVA 7,因此 String Switch 可以工作。

代码

opType.java

import java.io.*;

public final class opType {

   public static opType ADD = new opType( "Add" );
   public static opType SUB = new opType( "Sub" );
   public static opType MULT = new opType( "Mult" );
   public static opType DIV = new opType( "Div" );
   public static opType MOD = new opType( "Mod" );
   public static opType LPAR = new opType( "LParen" );
   public static opType RPAR = new opType( "RParen" );

   protected String name;

   private opType( String n )
   {
      name = n;
   }

   public String getName()
   {
      return name;
   }

Operator.java

public class Operator extends Token {

    protected opType val;

    public boolean isOperator() { return true; }
    public boolean isOperand() { return false; }

    protected int getPrec()
    {

        switch(val.getName())
        {
            case "LParen": 
            {
                return 0;
                break; //unreachable
            }

            case "RParen": 
            {
                return 0;
                break; //unreachable
            }

            case "Mult":
            {
                return 1;
                break; //unreachable
            }
            case "Div": 
            {   
                return 1;
                break; //unreachable
            }
            case "Mod": 
            {   
                return 1;
                break; //unreachable
            }
            case "Add": 
            {   
                return 2;
                break; //unreachable
            }
            case "Sub": 
            {   
                return 2;
                break; //unreachable
            }
        }

            return 0;
    }

    public static int compare( Operator a, Operator b )
    {
        if( a.getPrec() == b.getPrec() )
            return 0;
        else if( a.getPrec() < b.getPrec() )
            return -1;
        else
            return 1;
    }

    public opType getVal() { return val; }

    public Operator( opType v ) { val = v; }

}

【问题讨论】:

    标签: java switch-statement break


    【解决方案1】:

    您可以在这里评论return super.onOptionsItemSelected(item)这一行 注释此行后,代码将运行。 这对我有用

        public boolean onOptionsItemSelected(MenuItem item) {
          //return super.onOptionsItemSelected(item);  
           switch (item.getItemId()) {
               case R.id.aboutUS:
              Intent i = new   Intent("com.code.myapp.ABOUT");
                     startActivity(i);
                 break;
     
               case R.id.preferences:
     
                 break;
           }
           return false;
          }
    
    

    【讨论】:

      【解决方案2】:

      代码无法访问的原因是 return 在这种情况下表现得像 break - 它们都突然完成。

      如果一个语句突然完成,那么该行的执行将立即返回到相应的上下文;如果是break,它将尝试退出switch,或者如果存在则返回其关联标签;如果它是return,它将返回给它的调用者,有或没有值。

      这就是代码无法访问的原因:return 之后的代码行无法访问

      要真正理解这意味着什么,我们必须查看 Java 语言规范,特别是 14.1

      每个语句都有一个正常的执行模式,其中某些 进行计算步骤。以下部分描述 每种语句的正常执行模式。

      如果所有步骤都按照描述执行,没有任何迹象表明 突然完成,该语句被称为正常完成。 但是,某些事件可能会阻止语句完成 通常:

      break (§14.15)、continue (§14.16) 和 return (§14.17) 语句 导致控制权的转移,可能会阻止正常完成 包含它们的语句。

      对某些表达式的求值可能会引发 Java 异常 虚拟机(§15.6)。一个明确的 throw (§14.18) 语句也 导致异常。异常导致控制权转移 这可能会妨碍语句的正常完成。

      如果发生此类事件,则可能会执行一个或多个语句 在其正常执行模式的所有步骤完成之前终止 完全的;据说这样的陈述会突然完成。

      突然完成总是有一个相关的原因,这是一个 以下:

      • 一个没有标签的break

      • 带有给定标签的break

      • 没有标签的continue

      • 带有给定标签的continue

      • 一个没有价值的return

      • 具有给定值的return

      • 具有给定值的 throw,包括 Java 抛出的异常 虚拟机

      术语“正常完成”和“突然完成”也适用于 表达式的评估(§15.6)。表达式的唯一原因 可以突然完成是抛出异常,因为 具有给定值的抛出(第 14.18 节)或运行时异常或 错误(第 11 节、第 15.6 节)。

      如果语句对表达式求值,则突然完成 表达式总是导致立即突然完成 声明,同理。正常的所有后续步骤 执行模式不执行。

      除非本章另有规定,否则突然完成一个 子语句导致语句立即突然完成 本身,出于同样的原因,以及正常的所有后续步骤 语句的执行方式不被执行。

      除非另有说明,否则语句正常完成,如果 它评估的表达式和它执行的所有子语句完成 正常。

      【讨论】:

        【解决方案3】:

        如果你输入了return,那么函数会在break 执行之前返回,因此永远不会到达break

        相反,您可以使用设置为所需值的变量,并在切换后返回该变量。或者干脆去掉break 语句。

        【讨论】:

          【解决方案4】:

          return 语句有效地立即退出该方法。由于您已在每个caseswitch 块内放置了返回语句,因此根据您的代码,匹配的case 将立即返回指示的任何值。 break 因此无法执行,因此出现错误。你有两个选择:

          1- 设置一个值,并在方法结束时返回:

          protected int getPrec(){
              int prec = 0;
              switch(val.getName()) {
                  case "LParen": 
                      prec = 0;
                      break;
                  case "RParen": 
                      prec = 0;
                      break;
                  case "Mult":
                      prec = 1;
                      break;
                  case "Div": 
                      prec = 1;
                      break;
                  case "Mod": 
                      prec = 1;
                      break;
                  case "Add": 
                      prec = 2;
                      break;
                  case "Sub": 
                      prec = 2;
                      break;
                  default:
                      prec = 0;
                      break; // technically unnecessary since we're at the end already but adding for completeness.
              }
                  return prec;
          }
          

          2- 放弃 break; 语句并保留 return 语句,就像您编写的那样。

          就我个人而言,我更喜欢第一个选项,因为它对我来说更简洁、更易读。此外,如果将来需要,它可以更轻松地扩展在一种或多种情况下需要执行的任何操作。

          顺便说一句,请注意您的命名约定。您目前拥有:

          public final class opType // bad naming
          

          由于这是一个类,Java 标准是将类的首字母大写。所以应该是:

          public final class OpType // good naming
          

          【讨论】:

          • 命名约定不是我的,这些是我的导师给我们的课程,我们必须使用。但是谢谢你的提醒,我会记住的。
          • @SlashTag 嗯,我明白了,这很奇怪。如果是这样的话,我会向你的导师提及这一点,因为他们真的不应该以这种方式教授不良的编程习惯/实践。
          【解决方案5】:

          您已经拥有return,这将使break 无法访问

          【讨论】:

          • 你能澄清一下你的意思是什么回报吗?您是指循环外中断之前的那些。抱歉,说到 Java,我是个菜鸟。
          • 他的意思是,在所有情况下,您都有return x; break;,其中x 是一些常数。既然你有这些回报,休息永远不会被执行。
          猜你喜欢
          • 2016-03-03
          • 2018-06-06
          • 1970-01-01
          • 1970-01-01
          • 2017-04-29
          • 1970-01-01
          • 2015-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多