具有中断的无法访问的声明

时间:2013-11-23 00:58:53

标签: java switch-statement break

所以我有一个上一个问题,但意识到我发布了错误的违规代码。我在下面标出了令人不快的陈述。

我要做的是使用该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; }

}

5 个答案:

答案 0 :(得分:18)

如果您放置return,则该函数会在执行break之前返回,因此永远不会达到break

相反,您可以使用您设置为所需值的变量,并在交换机返回之后。或者只是删除break语句。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

代码无法访问的原因是return在该上下文中表现得像break - 它们都突然完成。

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

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

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

  

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

     

如果所有步骤都按照描述执行,没有任何指示   突然完成,据说声明正常完成。   但是,某些事件可能会阻止声明完成   通常:

     

中断(§14.15),继续(§14.16)和返回(§14.17)语句   导致控制权转移可能妨碍正常完成   包含它们的语句。

     

对某些表达式的评估可能会抛出Java中的异常   虚拟机(§15.6)。显式抛出(§14.18)声明也   导致例外。异常导致控制权转移   这可能会阻止正常完成陈述。

     

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

     

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

     
      
  • 没有标签的break

  •   
  • 带有指定标签的break

  •   
  • 没有标签的continue

  •   
  • 带有指定标签的continue

  •   
  • 没有值的return

  •   
  • 具有给定值的return

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

  •   
     

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

     

如果语句评估表达式,则突然完成   表达总是导致立即突然完成   声明,出于同样的原因。正常的所有后续步骤   不执行执行模式。

     

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

     

除非另有说明,否则语句正常完成   它评估的表达式以及它执行的所有子语句都完成了   通常

答案 3 :(得分:0)

return语句会立即有效地退出该方法。由于您已在每个switch的{​​{1}}块中放置了return语句,因此根据您的代码,无论case匹配,都会返回任何立即显示的值。因此case无法执行,因此错误。您有两种选择:

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

break

2-抛弃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; } 语句,并在写完break;语句时保留它们。

就我个人而言,我更喜欢第一种选择,因为它更清洁,更易读。此外,如果将来需要,还可以更容易地扩展在一个或多个案例中需要完成的任何操作。

顺便说一下,看看你的命名惯例。你现在有:

return

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

public final class opType // bad naming

答案 4 :(得分:0)

您可以在此处注释行 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;
      }