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