每次尝试启动代码时,我总是遇到相同的错误:

 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));
}

07-21 11:48