2012-03-14 131 views
1

我有一个接受字符串形式的消息的函数。消息如下所示:“HTTP/1.1 GET/1/\ n”在Java中拆分字符串

我一直在使用java.String.split方法将字符串分解为三个较小的子字符串,版本,命令和编号。然后我重新构造子串中的正弦字符串并输出它。

但是,当我运行teh函数时,程序导致ArrayIndex超出界限:1,但仍然正常工作。但是当我在调试器(netbeans)中一步一步地运行程序时,程序不会导致ArrayIndex超出界限无意义和功能正常

有什么建议吗?

山姆

String output = ""; 

     String[] tokens = clientMessage.split(" "); 
     String version = tokens[0]; 
     String command = tokens[1]; 
     String potNum = tokens[2]; 
     output = version + " " + command + " " + potNum; 

编辑肯定的,程序是多线程的,在clientMsessage字符串包含 “HTTP/1.1 GET/1/\ N” 的时候,FO clientMessage值不会改变。 clientMessage是从客户端程序发送的字符串,然后在服务器上处理,输出是snet回到客户端,但我不断收到阵列错误

+0

是什么'clientMessage'?通常情况下,如果您在跟踪调试期间和正常运行期间看到行为差异,则表示数据竞争,**是程序多线程?**,具体而言,它是否会异步生成'clientMessage'? – amit 2012-03-14 13:04:02

+0

我的猜测是你的clientMessage值在运行之间是不同的。通过在两次运行中输出值来验证clientMessage是否相同。 – gorjusborg 2012-03-14 13:04:13

+0

clientMessage有多长时间?如果客户端消息中没有足够的令牌,那么当您执行命令=令牌时,您将获得ArrayIndexOutOfBounds异常[1] – CodeBlue 2012-03-14 13:04:46

回答

0

ArrayIndexOutOfBounds在访问没有任何值的数组的索引时出现意味着在您的情况下令牌[1]不存在。调试时你使用相同的字符串作为输入?

2

我建议您打印/记录您的输入。当你调试你的程序时,我怀疑你正在做一些不同的事情。它有可能在您第一次调用它时起作用,但当它再次调用时,它会失败。

在分割之前添加。

System.out.println("clientMessage >" + clientMessage +"<"); 

如果你的输出看起来像

clientMessage >HTCPCP/1.0 PROPFIND /1/< 
clientMessage >HTCPCP/1.0 PROPFIND /1/< 
clientMessage >< 

看样子你有一个空的请求消息。我想这意味着客户端不会发送更多的请求,你必须以不同的方式处理。

+0

输出:clientMessage> HTCPCP/1.0 PROPFIND/1/< 输出> HTCPCP/1.0 PROPFIND/1/< clientMessage>< – Samishalt 2012-03-14 14:52:04

+0

所以你有一个空的客户端消息。您的请求看起来与您的模板非常不同。 – 2012-03-14 18:19:20

0

对不起,这不是一个答案,但只是一个额外的问题,以发现什么是真正的错误和评论太小,把这么多的代码。以下为我的作品,所以你的一个假设是错误的:

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     String clientMessage = "HTTP/1.1 GET /1/ \n"; 
     String[] tokens = clientMessage.split(" "); 
     String version = tokens[0]; 
     String command = tokens[1]; 
     String potNum = tokens[2]; 
     System.err.println(version + " " + command + " " + potNum); 

    } 

} 
0

它运行在我身边。我将不得不猜测,有时clientMessage是一个值不包含足够的空间分成3部分。

0

也许有更多的代码比你在这里包括。我将你的代码放在一个类中,如下所示,它编译并运行时没有错误。有什么遗漏吗?

public class Andrew { 
    public static void main(String args[]) { 
    String output = ""; 
    String clientMessage = "HTTP/1.1 GET /1/ \n"; 

     String[] tokens = clientMessage.split(" "); 
     String version = tokens[0]; 
     String command = tokens[1]; 
     String potNum = tokens[2]; 
     output = version + " " + command + " " + potNum; 

    System.out.println(output); 

    } 

}