【问题标题】:NumberFormatException when parsing String to Int将 String 解析为 Int 时出现 NumberFormatException
【发布时间】:2014-08-06 08:37:16
【问题描述】:

我正在编写代码来获取用户输入多项式的系数和指数。例如,我在控制台中输入“-3x^4+2x^3+1x^2-1x^1+8x^0”。我不断收到此错误:

Exception in thread "main" 

java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:470)
at java.lang.Integer.parseInt(Integer.java:499)
at polynomials.Driver.main(Driver.java:31)

但是,当我输入一个没有任何负数的多项式时(例如:“3x^4+2x^3+1x^2+1x^1+8x^0”),没有错误。我相信错误来自 Integer.parseInt(str2),但它不应该能够解析负整数吗?这对我来说毫无意义,我在其他任何地方都找不到任何东西......任何帮助都会是一个很大的帮助。谢谢大家!

public static void main(String[] args) {

    Scanner userInput = new Scanner(System.in);
    System.out.println("Enter a polynomial: ");

    String polynomial = userInput.nextLine();

    String newPoly = polynomial.replace("-", "+-").trim();

    String[] arr = newPoly.split("\\+");

    for (int i = 0; i<arr.length; i++) {
        System.out.println(arr[i]);

        String str = arr[i].trim();
        String[] arr2 = str.split("x");

        String str2 = arr2[0];

        System.out.println(str2); //prints coefficient
        System.out.println(str.substring(str.indexOf('^')+1)); //prints exponent
        System.out.println(Integer.parseInt(str2));
    }
}

【问题讨论】:

  • 您无法将表达式解析为整数。这就是错误的意思
  • 没有异常意味着他正在尝试解析一个空字符串。
  • 哦是的..!!我错了
  • 但我认为我在任何地方都没有空字符串...
  • 当多项式中没有使用负整数时,它没有任何意义

标签: java numberformatexception parseint


【解决方案1】:

这里你的输入字符串是-3x^4+2x^3+1x^2-1x^1+8x^0,它将在下面一行之后转换成+-3x^4+2x^3+1x^2-1x^1+8x^0

String newPoly = polynomial.replace("-", "+-").trim();

因此,当您尝试使用+ 作为分隔符进行拆分时,第一个值将生成为“”输入字符串,这会导致异常。

在for循环中添加一个if条件就可以了

for (int i = 0; i<arr.length; i++) {
    if(arr[i].length()>0){
        System.out.println(arr[i]);

        String str = arr[i].trim();
        String[] arr2 = str.split("x");

        String str2 = arr2[0];

        System.out.println(str2); //prints coefficient
        System.out.println(str.substring(str.indexOf('^')+1)); //prints exponent
        System.out.println(Integer.parseInt(str2));
    }
}

【讨论】:

  • 我如何摆脱这个空字符串,同时仍然保持这种替换和拆分的方法?
【解决方案2】:

不要这样预处理。您可以对.split() 参数使用一些智能正则表达式:

{

    Scanner userInput = new Scanner(System.in);
    System.out.println("Enter a polynomial: ");

    String polynomial = userInput.nextLine();

    String[] arr = polynomial.split("\\+|(?=-)");

}

然后你必须去掉生成的String[] 中的空字符串。不用担心,你可以修改for循环,更简单:

for (int i = ("".equals(arr[0]) ? 1 : 0); i < arr.length; i++)

这样,数组的第一个元素中的空字符串将被忽略,如果它在那里。

【讨论】:

  • 我在当前代码中解决了我的问题,方法是从 1 而不是 0 开始循环。我也一定会试试你的代码。谢谢! @Unihedron
  • @Ybarra 不客气。请注意,我主要担心的是polynomial.replace("-", "+-") 会消耗不必要的资源来执行正则表达式替换,这在您分解字符串(并放弃努力)时是无益的。由于.split() 本质上是进行正则表达式匹配和消费,所以它会是更好的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多