每次尝试启动代码时,我总是遇到相同的错误:
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中转换字符串,因为类ILOAD需要一个整数。如果代码太长,我很抱歉,但是这些类相互链接。希望你能帮我
最佳答案
您没有发布VariableSpace
类的代码,因此我假设它是一种映射,其中包含每个变量的值。
在Variable的构造函数中,您尝试将变量x
名称解析为一个整数,该整数以NumberFormatException
失败,因为x不代表整数。
您实际上想要从VariablStore
检索值
int value = variablStore.getValue(variable);
为此,需要从类
VariablStore
中访问Varaiable
的实例。目前,它是main方法中的局部方法。编辑
看到完整的代码后,这里是您需要的更改:
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));
}