0

我正在开发一个程序,该程序将给定的字符串作为给定 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。

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

4

2 回答 2

0

它可能是以下行之一:

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

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

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

if (parts.get(h-1).matches("-?\\d+(\\.\\d+)?")){
//convert
}
于 2017-02-25T19:57:56.743 回答
0

我已经解决了这个问题。基本上,尝试评估值时会出现错误,-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);
    }
}
于 2017-03-09T16:01:53.233 回答