2017-02-25 19 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 
}