2010-10-01 55 views
0

我正在使用Java处理小型服务器应用程序。所以,我收到来自不同客户端的信息,如果信息进来,下面的方法被称为:数组中的奇怪问题

public void writeToArray(String data) { 
    data = trim(data); 
    String[] netInput = new String[5]; 
    netInput[0]="a"; 
    netInput[1]="a"; 
    netInput[2]="a"; 
    netInput[3]="a"; 
    netInput[4]="a"; 
    netInput = split(data, ","); 
    pos_arr = PApplet.parseInt(netInput[0]); 
    rohr_value = PApplet.parseInt(netInput[1]); // THIS LINE KICKS OUT THE ERROR. 
    if(pos_arr >0 && pos_arr<100) { 
     fernrohre[pos_arr] = rohr_value; 
     println("pos arr length: " + fernrohre[pos_arr]); 
     println("pos arr: " + pos_arr); 
    } 

在OS X上的控制台使我有以下错误:

Exception in thread "Animation Thread" 
java.lang.ArrayIndexOutOfBoundsException:1 
at server_app.writeToArray(server_app.java:108) at server_app.draw(server_app.java:97) 
at processing.core.PApplet.handleDraw(PApplet.java:1606) 
at processing.core.PApplet.run(PApplet.java:1503) 
at java.lang.Thread.run(Thread.java:637) 

正如你可以看到,我试图用至少5个条目填充数组netInput,因此不能有ArrayIndexOutOfBoundsException。

我不明白,我很感谢您的帮助!

如果我能够发现错误并保持应用程序继续运行,它已经可以用于我了。

+2

请提供'split'方法 – 2010-10-01 11:05:47

+0

的代码@Carlos我读为'data.split( “”);'善于观察。 – Qwerky 2010-10-01 13:01:12

回答

1

你需要一些防御性代码,

if(netInput.length > 1) 
    pos_arr = PApplet.parseInt(netInput[0]); 
    rohr_value = PApplet.parseInt(netInput[1]); 
+0

非常感谢,也许这已经足够了,因为它在不确定的时间工作,也许有一次,他没有得到逗号,然后它崩溃了。谢谢。 – nbuechi 2010-10-01 10:18:01

10

你把5个字符串放到数组中,但是用这条线撤消所有好的工作;

netInput = split(data, ","); 

data显然没有任何逗号。

+3

或“split”方法不能按假定的方式工作...... – 2010-10-01 11:05:15

+2

+1 @carlos说的是什么。我们几乎所有人都认为'split'按预期工作。 – 2010-10-01 11:12:52

+0

我认为这里的基本误解是数组重新初始化,即使问题本身存在于分裂方法中。数组被错误地“预初始化”了五个字符串的方式对我来说真的是指出它并不期望分割返回足够的值。 – 2010-10-01 12:42:35

1

您制作 netInput = split(data, ","); 和
split(data,“,”);

returns one element array 
+0

我的工作是: c.write(FERNROHR_ID +“,”+ target +“\ n”); 所以数据里面有一个“,”。我想要第一部分,在逗号是netInput [0]之前,第二部分在逗号后面是netInput [1]。 有人可以帮助我吗? – nbuechi 2010-10-01 10:12:37

+0

然后我可以假设FERNROHR_ID - 是一个空字符串。 – 2010-10-01 10:26:38

+0

或者目标是一个空字符串 – 2010-10-01 10:27:23

2

更新

split()方法是定制的,而不是String.split。它也需要检查,看看发生了什么问题。感谢@Carlos指出。

原来的答案

考虑这条线:

netInput = split(data, ","); 

这将使用逗号data字符串分割为一个分隔符。它将返回一个(逗号+ 1)结果元素的数组。如果你的字符串没有逗号,你会得到一个单一的元素数组。

显然你的输入字符串没有任何逗号。这将导致单个元素数组(第一个元素aka index = 0将是该字符串本身)。因此,当您尝试索引第二个元素(索引= 1)时,会引发异常。

+0

是的,我明白这一点,但我发送: c.write(FERNROHR_ID +“,”+ target +“\ n”); 所以数据里面有一个“,”。我想要第一部分,在逗号是netInput [0]之前,第二部分在逗号后面是netInput [1]。有人可以帮助我吗? – nbuechi 2010-10-01 10:15:38

+1

@nbuechi:你需要仔细检查数据。尝试将其打印到sysout中,看看发生了什么。你分裂的逻辑是正确的,但显然这些数据并没有以想要的方式显示出来。 – 2010-10-01 10:18:38

+0

请注意,代码不是(直接)调用'String.split()'! – 2010-10-01 11:04:35

1

当调用split()方法时,您正在重新分配您的netInput变量。

新的值可能不是有5

数组数,您可以为split()方法的来源?

+0

我假设split()方法是调用writeToArray()方法的类/超类的一部分。由于字符串是最终的,不能扩展。 – Koekiebox 2010-10-01 10:56:28

2

在这一行

netInput = split(data, ","); 

您的阵列正在重新初始化。你的split方法可能会返回一个只有1个元素的数组(我可以猜测数据字符串不包含任何“,”)。