Java 基于 java.lang.NumberFormatException 的错误,涉及某种 "infinite" 值

Java Error based around java.lang.NumberFormatException concerning some sort of "infinite" value

我正在开发一个程序,该程序将给定字符串作为给定 x 值处的数学函数求值。我目前遇到如下列出的错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "-Infinity3"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at function.operateMD(function.java:212)
at function.evaluate(function.java:39)
at Graph.draw(Graph.java:127)
at Graph.main(Graph.java:22)

我不确定为什么会收到此错误。发送到方法的字符串是 "3x-1"

我的代码本质上是获取字符串,将其分解为一个索引的字符串,判断每个字符串的数学值(即运算符、变量等),然后运行一系列方法来简化函数,然后在给定的 x 值下对其进行评估。错误发生的方法(function.operateMD)在这里:

public static void operateMD()
{
    double tempPROD=0;
    double tempP1=0;
    double tempP2=0;

    for(int h=0;h<parts.size();h++)
    {
        if(types.get(h).equals("opr"))
        {
            tempP1=Double.parseDouble(parts.get(h-1));
            tempP2=Double.parseDouble(parts.get(h+1));
            if(parts.get(h).equals("*"))
            {
                tempPROD=tempP1*tempP2;
                parts.remove(h+1);
                parts.set(h-1, String.valueOf(tempPROD));
                parts.remove(h);
                types.remove(h+1);
                types.set(h-1, "num");
                types.remove(h);
            }
            else if(parts.get(h).equals("/"))
            {
                tempPROD=tempP1/tempP2;
                parts.remove(h+1);
                parts.set(h-1, String.valueOf(tempPROD));
                parts.remove(h);
                types.remove(h+1);
                types.set(h-1, "num");
                types.remove(h);
            }
        //end of if operator conditional
        }
        else if((h!=parts.size()-1)&&((types.get(h).equals("num"))&&types.get(h+1).equals("num")))
        {
            tempP1=Double.parseDouble(parts.get(h));
            tempP2=Double.parseDouble(parts.get(h+1));
            tempPROD=tempP1*tempP2;
            parts.remove(h+1);
            parts.set(h, String.valueOf(tempPROD));
            types.remove(h+1);
            types.set(h, "num");
        }
    //end loop to go through each part of arraylist
    }
//end of method
}

请注意,"parts" 是单索引字符串值的 Arraylist,而 "types" 是每个 "parts" 的数学值的 Arraylist。

这是我在这里发布的第一个编程问题,所以我希望我提供了足够的信息。

可能是以下几行之一:

tempP1=Double.parseDouble(parts.get(h-1));
tempP2=Double.parseDouble(parts.get(h+1));
...
tempP1=Double.parseDouble(parts.get(h));
tempP2=Double.parseDouble(parts.get(h+1));

看起来 parts arraylist 包含一些非数值,您的代码试图将其转换为 double,因此抛出 Exception.

在将字符串转换为 double 之前,您可以使用 regex 检查字符串是否为数字,例如:

if (parts.get(h-1).matches("-?\d+(\.\d+)?")){
//convert
}

我已经解决了这个问题。基本上,在尝试评估值 -Infinity3 时出现错误,因为循环不断尝试评估函数,但 ArrayLists 没有以两种方式更改:

首先,函数中计算的值没有被正确删除。其次,ArrayLists 本身并没有在 .evaluate() 方法的每个新实例中被清除,其中 operateMD 被调用。

我通过重构方法 operateMD 解决了问题,如下所示:

public static void operateMD()
{
    //setTypes();
    double tempPROD=0;
    double tempP1=0;
    double tempP2=0;

    for(int h=0;h<parts.size();h++)
    {
        if(types.get(h).equals("opr")&&((types.get(h-1).equals("num"))&&types.get(h+1).equals("num")))
        {
            if(parts.get(h).equals("*"))
            {
                tempP1=Double.parseDouble(parts.get(h-1));
                tempP2=Double.parseDouble(parts.get(h+1));
                tempPROD=tempP1*tempP2;
                parts.set(h-1, String.valueOf(tempPROD));
                types.set(h-1, "num");
                parts.remove(h);
                parts.remove(h);
                types.remove(h);
                types.remove(h);
            }
            else if(parts.get(h).equals("/"))
            {
                tempP1=Double.parseDouble(parts.get(h-1));
                tempP2=Double.parseDouble(parts.get(h+1));
                tempPROD=tempP1/tempP2;
                parts.set(h-1, String.valueOf(tempPROD));
                types.set(h-1, "num");
                parts.remove(h);
                parts.remove(h);
                types.remove(h);
                types.remove(h);
            }
        //end of if operator conditional
        }
        else if((h!=parts.size()-1)&&((types.get(h).equals("num"))&&types.get(h+1).equals("num")))
        {   
            tempP1=Double.parseDouble(parts.get(h));
            tempP2=Double.parseDouble(parts.get(h+1));
            tempPROD=tempP1*tempP2;
            parts.set(h, String.valueOf(tempPROD));
            parts.remove(h+1);
            types.remove(h+1);
        }
    //end loop to go through each part of arraylist
    }
//end of method
}

我在循环调用 operateMD() 之前将此方法添加为 运行:

public static void clear()
{
    for(int z=0;z<parts.size();z++)
    {
        parts.remove(z);
        types.remove(z);
    }
}