Java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

时间:2014-05-10 11:32:37

标签: java bluej operands

每当我尝试启动代码时,我总会遇到同样的错误:

 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需要一个整数。如果代码太长,我很抱歉,但是这些类是相互关联的。希望你能帮助我

4 个答案:

答案 0 :(得分:2)

查看docs for Integer

根据那些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

的原因

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