String op = tokens.next();
我必须在循环内做这个声明while
,如果我把它放在循环外,String op=null; while{...op=tokens.next();...}
我得到一个错误,说:The assigned value is never used
,但这是一个矛盾,因为我确实在while
.
然后在其他情况下,它要求声明在循环之外,例如在循环中for
。
public static int postfixEvaluate(String exp) {
Stack<Integer> s = new Stack<Integer> ();
Scanner tokens = new Scanner(exp);
//String op =null;
while (tokens.hasNext()) {
if (tokens.hasNextInt())
s.push(tokens.nextInt());
else {
int num2 = s.pop();
int num1 = s.pop();
String op = tokens.next();
if (op.equals("+"))
s.push(num1 + num2);
else {
if (op.equals("-"))
s.push(num1 - num2);
else{
if (op.equals("*"))
s.push(num1 * num2);
else
s.push(num1 / num2);
}
}}}
return s.pop();
}}
I. 它既不是错误也不是编译器的事情
实际上这不是错误,而是警告(警告),但不是来自编译器,而是 IDE 的功能,在这种情况下是 Netbeans(正如您在评论中确认的那样)。
此功能称为Unused Assignment,它是在 NetBeans 7.1 中引入的:
你可以看到这篇关于它的 JavaWorld 文章:NetBeans 7.1's Unused Assignment and Dead Branch Hints
发生的事情是@Flowen 在他的回答中所说的:您分配了一个您从不使用的值,因此 IDE 用口语告诉您:如果您不打算使用它,为什么要给我一个值?
让我们看两个代码片段:
片段 1:
IDE 不会要求您提供任何东西,因为您分配值并使用它:
片段 2:
IDE 将声明您,因为您分配了该值并且不使用它:
如果我这样做,他也会认领我吗?如果我用
op
对了吗?它还声称您,因为您没有分配
null
任何内容(打印的是op
更改为 value 的值a
。二、这是一个充满错误的功能
正如I中所述,这是一个 IDE 功能,它充满了 bug。要查看它,只需执行此 google 搜索:
site:netbeans.org unused assignment
它会在 netbeans.org 上向您显示有关此功能的所有信息,而不是偶然的大多数搜索结果都是错误报告。三、我所做的?
Unused assignment想教给我们的教训是,不要用你不会使用的值声明任何东西。
如果你不打算使用,
null
那么像这样声明你的变量是没有用的:像这样声明它:
并且仅当您要使用它时才分配该值:
但如果你这样做:
在
op="b"
其中,您将收到相同的警告:Unused assignment。为什么?IDE 并不像人们想象的那么愚蠢。即使它通过循环,op=b
也永远不会使用它。如果您这样做,警告将被删除:
它告诉您的是,
null
您分配给它的值永远不会被使用。这是真的,因为您将其替换tokens.next();
为while
.也就是说,它告诉你
valor
的是变量,而不是变量op
本身。The assigned value is never used
意味着在声明该变量时为该变量赋值是没有用的op
,因为以下引用的表达式op
恰好是一个新值的赋值op = tokens.next();
如果你想在循环外声明变量,你可以不给它赋值,像这样:
op
while
并且在循环内分配它时,您使用:
op
只要 被执行else
,您就可以使用该变量,对于解析器,if
和else
都有相同的执行机会,因此它会警告您,如果 被执行if
,则该变量op
没有被使用。所以建议你在else
.如果您删除初始分配,警告将消失:
或者,例如,如果您打印 的值
op
,if
警告也会消失:您显然没有
op
在分支中使用变量,if
这表明解析器不够聪明,无法忽略警告。