2017-02-25 21 views
0

我正在研究一个程序,它将给定的字符串评估为给定x值的数学函数。我目前遇到如下所列的错误:Java基于java.lang.NumberFormatException的错误,涉及某种“无限”值

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 
} 

注意,“份”是单指数字符串值的ArrayList,和“类型”是每个的“份的该ArrayList “的数学价值。

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

+0

看起来你需要调试你的代码。这是你应该做的,而不是我们,如果你不知道如何,现在是学习的好时机。请参阅:[什么是调试器,它如何帮助我诊断问题?](http://stackoverflow.com/q/25385173/5221149) – Andreas

+0

谢谢@Andreas我会试试看看我能否解决问题 – 2rtmar

回答

0

我已经解决了这个问题之前。基本上,当试图评估一个值-Infinity3时,由于循环不断尝试评估函数,但ArrayList未以两种方式更改,因此达到了该错误:

首先,已在函数中评估的值未被删除正常。其次,阵列列表本身在.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); 
    } 
} 
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)); 

貌似parts ArrayList包含你的代码试图转换为double,因此,引发Exception一些非数值。

您可以检查一个字符串是否是数字与regex将其转换为double例如为:

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