所以我有一个上一个问题,但意识到我发布了错误的违规代码。我在下面标出了令人不快的陈述。
我要做的是使用该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; }
}
答案 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;
}