我正在尝试将存储在堆栈中的char转换为整数,这就是我所做的。
operands = new StackLinked();
if ( (a == '0') || (a == '1') || (a == '2') || (a == '3') || (a == '4') ||
(a == '5') || (a == '6') || (a == '7') || (a == '8') || (a == '9') )
{
operands.push(a); /*Stor operands in the stack operands.*/
}
//This line crushes my program. I don't know why.
int op1 = ((Integer)operands.peek()).intValue();
答案 0 :(得分:7)
您尚未展示a
的声明,但我怀疑它的类型为char
。然后将其自动装箱到Character
,因此当你施放到Integer
时,施法会失败。
如果您更改要使用的代码:
operands.push((int) a);
应该从char
转换为int
然后转换为Integer
并且您将离开。
或者,使用:
// Implicit conversion from char to int
int op1 = ((Character) operands.peek()).charValue();
编辑:请注意,当a ='1'时,上述解决方案最终会给出op1 = 49,当a ='2'时,op2 = 50等等。如果你真的想要op1 = 1当a ='1'时你可以使用Character.digit
或(因为我们已经知道'a'在'0'到'9'的范围内)你可以减去'0',即
operands.push((int) (a-'0'));
或
int op1 = ((Character) operands.peek()).charValue() - '0';
在第一种情况下,演员实际上是多余的,因为减法的结果将是int
而不是char
- 但为了清楚起见,我会把它留在那里。
答案 1 :(得分:1)
你必须使用1.5。所以这是另一种正确的方法:
if (a >= '0' && a <= '9') {
operands.push(a);
}
char c = operands.peek();
int op1 = (int) c; //check Character.isDigit(c), if there is other stuff in the stack
答案 2 :(得分:1)
将char转换为int值的简单方法是执行
if (a >= '0' && a <= '9') {
operands.push(a - '0'); // converts a char to an int.
}
int op1 = (Integer) operands.peek();
答案 3 :(得分:0)
你确定你真的把任何东西推到了堆栈上吗?如果没有,则抛出EmptyStackException。你有什么例外吗?
答案 4 :(得分:0)
你的例子可能有点含糊不清,这是我的假设:
您正在使用Java 1.5 langauge功能(由于装箱/拆箱)。
操作数的行为类似于Stack&lt; Character&gt;();
当你将一个字符串推入堆栈时,它被装箱为一个字符。您不能将Character实例强制转换为Integer。您必须使用获取原始数值,然后将其转换为整数原语。
试试这个:
int op1 = (int) operands.peek().charValue();
答案 5 :(得分:0)
如果没有看到StackLinked的定义,这真的很难,那是你自己的一个类吗?
我可以想到几个选择: 堆栈在某种程度上是空的(例如,a不是这些字符之一)。
或者'a'在堆栈中保存为Character(而不是char),然后转换为Integer失败。您可能需要先从角色中获取char。
答案 6 :(得分:0)
你正在推动Char,而不是整数。你需要这样说:
Char op1 = (Char)operands.peek();
int opcode = Char.digit(op1.charValue(),10);
(我的Java有点生疏,很抱歉,如果某些方法名称略有错误)
此外,您的 Peek 方法是否返回null(因为 if 语句评估为false),那么您的代码将崩溃。
答案 7 :(得分:0)
将char转换为int
最简单的方法是:
operands.push(Integer.parseInt(Character.toString(a)));