1

コードを開始しようとするたびに、常に同じエラーが発生します。

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

}

私が抱えている問題は、クラスILOADが整数を必要とするため、文字列を整数に変換しようとするクラス変数にあります。コードが長すぎて申し訳ありませんが、クラスは相互にリンクされています。あなたが私を助けてくれることを願っています

4

4 に答える 4

2

Integerのドキュメントを見てください。

それらによるとInteger.parseInt(String s)

NumberFormatException をスローします - 文字列に解析可能な整数が含まれていない場合

何も含まない文字列から整数を解析することは、クラスのこのコンストラクターでまさにあなたがやろうとしていることですVariable...

public Variable(final String variable)
{
    this.variable = variable;
    int value = Integer.parseInt(variable);
}

...このように呼び出すと。

new Variable("x")
于 2014-05-10T11:36:51.597 に答える
1

class のコードを投稿していないVariableSpaceので、各変数の値を保持する一種のマップだと思います。

Variable のコンストラクターで、変数x名を int として解析しようとしていますが、 NumberFormatExceptionx は整数を表していないため、a で失敗します。

あなたがしたいことは、実際に値を取得することですVariablStore

int value = variablStore.getValue(variable);

そのためには、 のインスタンスがVariablStoreclass からアクセスできる必要があります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));
}
于 2014-05-10T11:42:37.913 に答える
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」を整数に変換しようとしています

public Variable(final String variable)
    {
        this.variable = variable;
        int value = Integer.parseInt(variable);
    }
于 2014-05-10T11:37:24.760 に答える
1

「x」を整数に解析しようとしています。可能だと思いますか?間違いなくいいえ!それが NumberFormatException をスローする理由です

NumberFormatExceptionについて読む

于 2014-05-10T11:38:05.373 に答える