微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ArrayIndexOutOfBoundsException: 2 - 超出数组边界?

如何解决ArrayIndexOutOfBoundsException: 2 - 超出数组边界?

我将 3 个传感器值从 Arduino 发送到 Processing 并将字符串拆分为数组中的三个元素。 有时当我运行程序时,我会收到 Arrayindexoutofboundsexception: 2 错误,据我所知,这意味着我正在尝试访问数组中不存在的元素。 我做错了什么?

我来自 Processing 和 Arduino 的代码如下:

处理:

import processing.serial.*;

Serial port;
float background;
float r1;
int a;
int b;
int c;
PrintWriter output;
DataBox Data1 = new DataBox(20,20);
DataBox Data2 = new DataBox(20,190);
DataBox Data3 = new DataBox(20,360);

void setup() {
  size (690,530);
  port = new Serial(this,"COM3",9600);
  output = createWriter(hour() + "." + minute() + "." + second() + ".txt");
}

void draw() {
  background(60,40);
  Data1.drawDataBoxHumi();
  Data2.drawDataBoxTemp();
  Data3.drawDataBoxMoist();

  if (port.available() > 0) {
    String inString = port.readStringUntil('\n');
    if (inString != null) {
      inString = trim(inString);
      String[] data = split(inString,'#');

      a = int(data[0]);
      b = int(data[1]);
      c = int(data[2]);

      output.println("Tidspunkt:" + " " + hour() + ":" + minute() + ":" + second() + " - " 
        + "Luftfugtighed:" + a +"%" + " "+ "Temperatur:" + b + " " + "Jordfugtighed:" + " " + c);
      output.flush();
    }
  }
}

阿杜诺:

#include <dht.h>

dht DHT;

#define DHT11_PIN 7

void setup() {
  Serial.begin(9600);
  pinMode(A0,INPUT);
}

void loop() {
  int SensorValue = analogRead(A0); 
                                      

  int chk = DHT.read11(DHT11_PIN);

  Serial.print(DHT.humidity);
  Serial.print("#");
  Serial.print(DHT.temperature);
  Serial.print("#");
  Serial.print(SensorValue);
  Serial.println("#");
  delay(1500);
}

解决方法

尝试检查(通过打印)port.readStringUntil('\n') 每次返回什么完全,并以同样的方式检查 trim() 之后剩下的内容。

有时可能是 readStringUntil() 超时,然后只返回 0,这是一个没有任何 # 的字符串,这将 split 变成一个 1 元素大批。它也可能以某种方式读取留在缓冲区中的虚假数据,具有相同的效果。

找出答案的唯一方法是检查上面所说的 inString。

您可以通过在处理单个数组元素之前检查 String[] data 中的元素数量来防止运行时错误,但这并不能解决潜在的问题。不过,它可能足以满足您的目的。

几点说明:

您不需要从 Arduino 发送最后一个 (3rd) #;您只需要 2 个就可以将 Arduino String 分成 3 个部分,并且有 3 个 # 可能会导致 split 产生 4 个部分。不过,它最后需要一个 \n

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。