2011-11-25 259 views
1

我有一个字符串= “1.515 53.11 612.1 95.1 0 0 0 0” 我特林通过这个代码解析它:用分隔符分析字符串“;” (JAVA)

public class SendThread implements Runnable { 
    public void run() 
    { 
     socket = null; 
     BufferedReader in; 


     while (true) 
     { 
      // Loop until connected to server 
      while (socket == null){ 
       try{ 
        socket = new Socket ("192.168.137.1", 808);   
       } 
       catch (Exception e) { 
        socket = null; 

        //Log.d("Connection:", "Trying to connect..."); 
       } 
       try { 
       Thread.sleep(30); 
       } catch (Exception e) {} 
      } 

      // Get from the server 
      try { 

       in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

       Log.d("Connection: ", "connected"); 

       String line = null; 

       while ((line = in.readLine()) != null) { 

        Log.d("Socket:", line); 

        NumberFormat nf = new DecimalFormat ("990,0"); 
        String[] tokens = null; 
        String[] tempData = null; 
        String[] windData = null; 

        try { 
         tokens = line.split(";"); 
         tempData = tokens[0].trim().split(" "); 
         windData = tokens[1].trim().split(" "); 
        } catch (Exception error) 
        { 
         Log.d("Parsing error:", error+""); 
        } 



        for (int i = 0; i < currentTemp.length; i++) 
         currentTemp[i] = (Double) nf.parse(tempData[i]); 
        for (int i = 0; i < currentWind.length; i++) 
         currentWind[i] = (Double) nf.parse(windData[i]); 

        //Toast.makeText(getApplicationContext(), "Received data:", duration) 
        for (int i = 0; i < currentTemp.length; i++){ 
         Log.d("Converted data: currentTemp["+i+"] = ", currentTemp[i]+""); 
        } 
        for (int i = 0; i < currentWind.length; i++){ 
         Log.d("Converted data: currentWind["+i+"] = ", currentWind[i]+""); 
        } 
       } 
       socket = null; 
       Log.d("Connection: ", "lost."); 

      } 
      catch (Exception e) { 
        socket = null; 
        Log.d("Connection: ", "lost."); 
        Log.d("Connection:", e+""); 
      } 
     } 
    } 
} 

错误代码:(但我不知道更好的方法来保持套接字连接:)

我总是得到“java.text.ParseException:Unparseable number”。如何解决它?

令牌,TempData的,windData都是String []

+3

您报告的错误未由您发布的代码生成。 – cherouvim

+0

你确定这就是你正在做的?我将代码放在一起,没有错误。此外,似乎你在试图解析数字时遇到了这种例外情况,这不在你提供的代码 –

+0

中,你应该发布一个更大的代码段,除了\\;问题,我们仍然在猜测 – soulcheck

回答

3

除了别人怎么说,我敢打赌,当你做

windData = tokens[1].split(" "); 

windDate = {"","0","0","0","0"} 

,并尝试分析的第一个元素为Number 。 尝试做:

try { 
    tokens = line.split(";"); 
    tempData = tokens[0].trim().split(" "); 
    windData = tokens[1].trim().split(" "); 
} catch (Exception error) 
{ 
    Log.d("Parsing error:", error+""); 
} 
+0

是的!非常感谢你,现在它的解析就像它应该 –

+0

无论如何这是一个猜测作为马克英格拉姆说,你可能想用\\ s而不是“”来分割令牌。 – soulcheck

0

尝试使用在分割为空白的\s;例如tempData = tokens[0].split("\s"); ...它代表一个空白字符。

+0

无效的转义序列(有效的转义序列是\ b \ t \ n \ f \ r \“\'\\) –

+1

Try \\ s。\必须在java字符串中转义 – soulcheck

2

您不需要转义分号。试试看:

try { 
    tokens = line.split(";"); 
    tempData = tokens[0].split(" "); 
    windData = tokens[1].split(" "); 
} catch (Exception error) 
{ 
    Log.d("Parsing error:", error+""); 
} 

我怀疑你的分析错误是因为输入字符串中95.1之后的空格。就像这样,你的tempData数组将有5个值,最后一个是''。试图将其解析为一个数字会给你一个例外。

+0

我试过了之前插入\\ 没有帮助... –

+0

我添加了更多的信息到我的答案,关于异常的原因 – Chris

1

嗯,你的代码(发布)不会产生这个异常。其次,"\\;"是多余的,你可以写";"

1

你可以使用,字符串标记为那。

String s = "1.515 53.11 612.1 95.1 ; 0 0 0 0"; 

    StringTokenizer tokenizer = new StringTokenizer(s,";"); 

    while(tokenizer.hasMoreElements()){ 
     StringTokenizer numberTokenize = new StringTokenizer(tokenizer.nextToken()); 
     while(numberTokenize.hasMoreElements()) { 
      System.out.println(numberTokenize.nextElement()); 
     } 
    }