Обработка исключения nullPointerException

У меня ошибка nullPointerException в строке if (stringReceive.contains(tabStock[j])){ но я не понимаю почему ошибка с индексом j массива tabstock.

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

String[] tabStock = new String[6];
String[] tabReceive = new String[6];
String stringReceive;
String oldStringReceive;
int cptEssai = 0;
int cpt = 0;

void setup() {
size(400,400);
frameRate(25);
/* start oscP5, listening for incoming messages at port 12000 */
oscP5 = new OscP5(this,12000);

myRemoteLocation = new NetAddress("127.0.0.1",12001);

tabStock[0] = "1";
tabStock[1] = "2";
tabStock[2] = "3";
tabStock[3] = "4";
tabStock[4] = "5";
tabStock[5] = "6";
//stringReceive = "A3E8F6";
tabReceive[0] = "1";
tabReceive[1] = "2";
tabReceive[2] = "3";
tabReceive[3] = "4";
tabReceive[4] = "3";
tabReceive[5] = "6";


}


void draw() {
   background(0);
   compare();

}

void mousePressed() {

    OscMessage myMessage = new OscMessage("/test");

    myMessage.add(123); /* add an int to the osc message */

  /* send the message */
oscP5.send(myMessage, myRemoteLocation);
}


/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) {
/* print the address pattern and the typetag of the received OscMessage */
print("### received an osc message.");
print(" addrpattern: "+theOscMessage.addrPattern());
println(" typetag: "+theOscMessage.typetag());
stringReceive = theOscMessage.addrPattern();
println(stringReceive);
if (oldStringReceive != stringReceive){
    oldStringReceive = stringReceive;
}
}

void compare() {
    println(stringReceive);
    println("compare()");
    boolean failed=false;
    int j = 0;
    while (cptEssai < 3 && !failed){ 
    for (int i= 0; i < tabStock.length; i++){

    while(j<6){
         if (stringReceive.contains(tabStock[j])){
         print("tag existe et bien placé   //   ");
         print("allumage de la lampe qui correspond à ce tag   //   ");
         j++;
    }
         else {
              print("tag n'existe pas ou mal placé   //   ");
              print("extinction de toutes les lampes   //   ");
              oldStringReceive = stringReceive;
         if (oldStringReceive != stringReceive){
             cptEssai++;
             failed = true;
             break;
         }
         else
         {
            if(j>0){
            j--;
         }
         }

    }
   }
  }
  }
  print("GAME OVER ! Désactivation de l'épreuve   //   ");
}

person Vince    schedule 14.03.2016    source источник
comment
приведите минимальный пример проблемы. вы разместили довольно много кода, который не имеет отношения к вашей проблеме.   -  person umläute    schedule 18.03.2016
comment
также я не понимаю, как это связано с Pure Data; в то время как Pd может быть отправителем сообщения OSC, корректная обработка сообщения (или отбрасывание любого недопустимого сообщения) полностью зависит от приложения-получателя. кстати, каково значение stringReceive?   -  person umläute    schedule 18.03.2016


Ответы (1)


Либо tabStock, либо tabStock[j], либо stringReceive равно null.

Распечатайте их значения перед этой строкой, чтобы проверить, какое именно.

Как только вы узнаете, какой именно, проследите свой код, чтобы выяснить, почему он нулевой.

person Kevin Workman    schedule 14.03.2016
comment
Спасибо за Ваш ответ. Я распечатал tabStock, tabStock[j] и stringReceive. tabStock печатает что-то странное, чего я не понимаю [Ljava.lang.String;@1bc135b, tabStock[j] печатает 1, так что все в порядке, а stringReceive печатает null. Я обнаружил, что он нулевой, потому что компилятор не выполняет функцию oscEvent(OscMessage theOscMessage), поэтому он не может повлиять на theOscMessage.addrPattern(); до stringReceive. Вы знаете чистые данные? На самом деле theOscMessage.addrPattern(); — это значение, которое я извлекаю из Pure Data. - person Vince; 15.03.2016
comment
@ Винс Нет, я никогда не работал с этой библиотекой, извините. Строка println(tabStock) печатает хэш-код массива, поскольку println() недостаточно умен, чтобы знать, как печатать массив. Вместо этого вы можете использовать функцию printArray(). - person Kevin Workman; 15.03.2016
comment
Pure Data — это не библиотека, это программное обеспечение, но oscP5 — это библиотека. Я попробовал функцию printArray(), и она печатает массив, но теперь я застрял. Поэтому я постараюсь задать свой вопрос тому, кто разбирается в Pure Data и oscP5. Спасибо, в любом случае ! - person Vince; 15.03.2016