2014-12-22 108 views
0

有人可以幫助我瞭解爲什麼,如果我的VAL值是"0"Integer.parseInt(val)返回我NumberFormatException,如果我寫Integer.parseInt("0")它工作正常...parseInt函數處理

有一個比較容易的方式直接讀取int值工作從串行?

void draw(){ 
    i=0; 
    byte[] str = new byte[5]; 

    if (myPort.available() > 0) 
    { 
     myPort.readBytesUntil(10, inBuffer); 
     if(inBuffer==null){ 
      //... 
     } 
     else 
     { 
      while(inBuffer[i]!=13){ 
       str[i]=inBuffer[i]; 
       println((int)str[i]); 
       i++; 
      } 
      String val = new String(str); 
      i = Integer.parseInt(val); 
      println(i); 
     } 
    } 
} 

回答

-1

您能否提供一個MCVE來證明問題?使用硬編碼值並儘可能簡單,如下所示:

void setup(){ 
    String val = "0"; 
    int i = Integer.parseInt(val); 
    println(i); 
} 

打印出val的值後,再嘗試解析它。我敢打賭,這不是你認爲的價值。

+0

這不是一個答案,應該是一個註釋。 –

+0

@IngoBürk我不同意。答案是在解析它之前打印出字符串的值,並且這個錯誤發生的時間有90%會工作。 –

+0

不,您的帖子會要求OP在解析前打印出來,因爲您懷疑其值不同。這是懷疑和要求反饋,而不是回答這個問題。 –

1

在處理中port.readBytesUntil(ch, buffer)port中讀取所有字符,直到遭遇字符等於ch。 在Windows線隔離器由2個字符(0d,0a)(13,10)組成。

所以,如果你寫序列"23",下一個新行,下次"45"等等,buffer看起來就像這樣:

char[] buffer : '2', '3', '0x0d', '0x0a', '4', '5', '0x0d', '0x0a', ... 

所以當你readBytesUntil(10, ...)閱讀它3個字符:'2', '3', '0x0d'

考慮這樣的例子:

char[] c = {'2', '3', 13}; 
String str = new String(c); 
System.out.println(str);    // you will see "23" 
System.out.println(str.length());  // lenght will be 3 
System.out.println(Integer.parseInt(str.trim())); // will be OK 
System.out.println(Integer.parseInt(str)); // will throw NumberFormatException 

因此,嘗試你的緩衝區轉換爲字符串和trim()此字符串。

== ==編輯


處理爲您提供了一些方便的方法,如:

String str = port.readStringUntil(10); 
str = str.trim(); 
+0

OHHHH!謝謝我不知道像trim()這樣的函數存在,謝謝你的回答! –