每当我尝试启动代码时,我总会遇到同样的错误:
java.lang.NumberFormatException: For input string: "x"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at Variable.<init>(Variable.java:17)
at Main.main(Main.java:4)`
我也放了我的代码。你能帮我理解出了什么问题吗?
public class Main {
public static void main(final String[] args) {
final Node expression =
new Plus(
new Minus(
new Plus(
new Variable("x"),
new Literal(2)
),
new Variable("y")
),
new Minus(
new Literal(4),
new Variable("z")
)
);
// an interpreter would just evaluate the expression:
System.out.println("Expression is: " + expression);
// a compiler would compile the expression into a program
System.out.println("Compiling expression...");
final Program program = new Program();
expression.generateCode(program);
System.out.println("Resulting program:\n"+program);
// and, later, that program can then be executed after the variables have been assigned
// First assignment of variables
VariableSpace variables = new VariableSpace();
variables.store("x", 5);
variables.store("y", 7);
variables.store("z", 1);
System.out.println("For x = 5, y = 7 and z = 1 the program executes and returns:");
int resultOfExecution = program.execute(variables);
System.out.println(resultOfExecution);
// Second assignment of variables
variables.store("x", 11);
variables.store("y", 3);
variables.store("z", 2);
System.out.println("For x = 11, y = 3, and z = 2 the program executes and returns:");
resultOfExecution = program.execute(variables);
System.out.println(resultOfExecution);
}
public class Variable extends Node
{
String variable;
int value;
/**
* Constructor for objects of class Variable
*/
public Variable(final String variable)
{
this.variable = variable;
int value = Integer.parseInt(variable);
}
public void generateCode(final Program program) {
program.append(new ILOAD(value));
}
/**
* Return a int representing this expression
* (e.g., new Literal(19).toint() is "19").
*/
public String toString() {
return "" + value;
}
}
import java.util.ArrayList;
/**
* A Node in an abstract syntax tree (AST)
* for a very simple expression language.
* The language only supports the following subtypes of Nodes:
* <ul>
* <li>integer values (class Literal)
* <li>integer variables (class Variables)
* <li>the integer + operator (class Plus)
* <li>the integer - operator (class Minus)
* </ul>
* It does not support types other than integers.
*/
public class Node {
/**
* Compile this AST into an IJVM program:
* Append instructions to the given Program
* such that the instructions, when executed
* produce the same value
* as is produced by a call to evaluate().
*/
public void generateCode(Program program) {
}
/**
* Generate a string-representation of the subtree.
* When you implement this method in subclasses,
* where possible use recursive calls to left.toString() and
* to right.toString() to do this.
*/
public String toString() {
return null;
}
}
public class ILOAD extends Instruction
{
private final int value;
public ILOAD(final int value)
{
this.value = value;
}
public void execute(Storage storage) {
storage.getStack().push(value);
}
/**
* Produce a human-readable String-representation of this instruction.
*/
public String toString() {
return "ILAOAD " + value;
}
}
import java.util.*;
/**
* A space that stores the variables during the execution of the IJVM/Java bytecode.
*/
public class VariableSpace {
private HashMap<String, Integer> value;
public VariableSpace() {
value = new HashMap<String, Integer>();
}
public void store(String name, int value) {
this.value.put(name, value);
}
public int load(String name) {
return value.get(name);
}
}
我遇到的问题是在类变量中,我尝试在Integer中转换String,因为类ILOAD需要一个整数。如果代码太长,我很抱歉,但是这些类是相互关联的。希望你能帮助我
答案 0 :(得分:2)
根据那些Integer.parseInt(String s)
抛出 NumberFormatException - 如果字符串不包含可解析的 整数
从包含none的String中解析整数正是您在类Variable
的构造函数中尝试执行的操作...
public Variable(final String variable)
{
this.variable = variable;
int value = Integer.parseInt(variable);
}
......当你这样调用它时。
new Variable("x")
答案 1 :(得分:1)
错误消息是明确的
java.lang.NumberFormatException: For input string: "x"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
你试图在parseInt()方法中将字符串“x”转换为Integer,可能是在这部分
public Variable(final String variable)
{
this.variable = variable;
int value = Integer.parseInt(variable);
}
答案 2 :(得分:1)
你正试图解析&#34; x&#34;变成整数。你觉得可能吗?绝对没有!这就是它抛出NumberFormatException
的原因答案 3 :(得分:1)
你没有发布类VariableSpace
的代码,所以我假设它是一个地图的kinde,它保存每个变量的值。
在Variable的构造函数中,您尝试将变量x
名称解析为以NumberFormatException
失败的int,因为x不表示整数。
您要做的是从VariablStore
int value = variablStore.getValue(variable);
为此,VariablStore
的实例需要可以从班级Varaiable
访问。目前它在主要方法中是本地的。
修改强>
看完整个代码后,您需要进行以下更改:
ILOAD课程
/**
* ILOAD instruction gets the valiable name for later retrieving of the value
* in {@link ILOAD#execute(Storage)}
*
* @param variable
*/
public ILOAD(final String variable)
{
this.variable = variable;
}
/**
* retrieve the variable value using its name from the storage and push it on the stack
*/
public void execute(Storage storage) {
storage.getStack().push(storage.getVariables().load(variable));
}
变量类
String variable;
/**
* Constructor for objects of class Variable
*/
public Variable(final String variable)
{
this.variable = variable;
}
/**
* Create a ILOAD instance and pass it the variable name.
* ILOAD extends Instruction and overrides the method {@link Instruction#execute(Storage)}
* which get as argument the {@link Storage} class and from which the value can be retrieved.
*/
public void generateCode(final Program program) {
program.append(new ILOAD(variable));
}