2013-11-23 72 views
2

所以我有一个前面的问题,但意识到我发布了错误的代码。我在下面标出了这些违规的陈述。无法访问的声明与中断

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

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

就像一个笔记,我运行JAVA 7所以字符串开关将工作。

代码

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

} 

回答

15

如果你把一个return,然后该函数在0之前返回执行,因此永远不会到达break

取而代之,您可以使用您设置为所需值的变量,并在切换后返回该变量。或者只是摆脱break声明。

4

你已经有return这将使break可达

+0

你能说清楚你的意思是什么吗?你的意思是在循环之外的那个之前的那些人。对不起,当谈到Java时,我是一个noob。 – SlashTag

+0

他的意思是,在你所有的情况下,你都有'return x;休息;'哪里'X'是一些常数。既然你有这些回报,这些休息就不会被执行。 –

0

return语句会立即有效地退出该方法。由于你已经在switch块内为每个case放置了返回语句,所以无论哪个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 
+0

命名约定不是我的,这些是我的导师给出的我们必须使用的类。但是,谢谢你的高举,我会牢记在心。 – SlashTag

+0

@SlashTag嗯,我明白了,那很奇怪。如果是这样的话,我会向你的老师提及这一点,因为他们真的不应该以这种方式教导糟糕的编程习惯/做法。 –

2

原因代码是不可到达的是由于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 虚拟机

    抛出的异常

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

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

除非本章另有规定外,一个 子语句的突然结束导致的声明 本身的即时突然完成,以同样的理由,并且不执行该语句的执行正常 模式下,所有后续步骤。

除非另有规定,否则声明将正常完成,如果所有 表达式评估并且它执行的所有子状态正常完成 。