2013-12-02 4 views
0

У меня есть строка, и я разбиваю эту строку на токены, а затем я конвертирую маркеры в biginteger для дальнейшей обработки. Я получаю ошибку java.lang.NumberFormatExceptionBigInteger - ошибка java.lang.NumberFormatException?

здесь фрагмент кода

public void tokenize() { 
    StringTokenizer st = new StringTokenizer(expr); 
    while (st.hasMoreElements()) { 
     String val = st.nextElement().toString(); 
     if (isOperator(val)) { 
      operator.push(val); 
     } 
     else { 
      BigInteger op = new BigInteger(val); 
      operand.push(op); 
     } 
    } 
} 

Формат выражения как этот

4 + 5 + 6/2 - 8 * 1 * 2 

и это выражение становится лексемы, что приводит к операнде и оператор

+0

Возможно, дайте нам свой expr, и вы используете как оператор, так и операнд, что это? –

+0

Как выглядит val, например? – hbsrud

+1

post isOperator() метод реализации –

ответ

2

С этим определением isOperator он работает хорошо.

boolean isOperator(String s) { 
    return s.equals("*") || s.equals("-") || s.equals("/") || s.equals("+"); 
} 

public void tokenize(String expr) { 
    StringTokenizer st = new StringTokenizer(expr); 
    while (st.hasMoreElements()) { 
     String val = st.nextElement().toString(); 
     if (isOperator(val)) { 
      //operator.push(val); 
      System.out.println("Val"); 
      System.out.println(val); 
     } 
     else { 
      //operand.push(op); 
      System.out.println("Operand"); 
      BigInteger op = new BigInteger(val); 
      System.out.println(op); 
     } 
    } 
} 

Вы использовали == для сравнения операторов?

+0

Извините, портирован на java из C++ после долгого времени, вы не можете просто просто потерять привычку :) – Aki008

0

Ваше входное выражение имеет 2 пробела между 2 и - Это может привести к в пустой строке, отправляемой в другую часть вашего кода, где BigInteger выдавал исключение.


ОК, единственный способ, который может дать вам исключение в числовом формате, - это когда ваша проверка не выполняется в операнде. Пожалуйста, напишите свой метод здесь.

+0

Нет, вы его протестировали? он не дает пустые строки. –

1

попробовать это ...

public static void main(String[] args) { 
    String s = "4 + 5 + 6/2 - 8 * 1 * 2"; 
    StringTokenizer tokenizer = new StringTokenizer(s); 
    while(tokenizer.hasMoreElements()) { 
     String s2 = (String) tokenizer.nextElement(); 
     if(isArithmaticOp(s2.charAt(0))) { 
      System.out.println("Op = "+s2); 
     } else { 
      BigInteger bigInteger = new BigInteger(s2); 
      System.out.println("Integer = "+bigInteger); 
     } 
    } 
} 

private static boolean isArithmaticOp(char c) { 
    return c == '+' || c == '-' || c == '/' || c == '*' || c == '%' 
      || c == '^'; 
} 
Смежные вопросы