【问题标题】:NullPointerException with Websocket in Processing Sketch处理草图中带有 Websocket 的 NullPointerException
【发布时间】:2018-05-15 14:53:28
【问题描述】:

我已经在处理中设置了一个示例,该示例通过使用语音识别库http://florianschulz.info/stt/ 运行良好

我正在尝试将字符串的内容发送到 Draw 函数,当您未在 void setup 中定义默认值时,它会导致 NullException 错误

首先,我虽然应该设置一个全局字符串 msg,但无论我如何尝试定义它,它都不会用除了单词 test 之外的任何内容更新 draw 函数。这是因为我在 void setup() 中将其定义为具有值“test”

但是如果去掉test这个词,又会导致null异常错误。

发生的情况是 String msg 默认为 value test 但是一旦你对着笔记本电脑的麦克风说话,控制台应该通过 text() 更新单词或句子;函数,然后使用更新的单词出现在处理 java 窗口中。

import websockets.*;
WebsocketServer socket;
PFont f;
String msg;

    void setup() {

      socket = new WebsocketServer(this, 1337, "/p5websocket");
      noLoop();
      size(480, 120);
      f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on 
       if (msg == null){
         msg="test";
         println(msg);
      }
      else{
        println(msg);

      }
    }

    void draw() {
      background(100);
      textFont(f,36);
      fill(180);  
      println(msg);
      text(msg, 10, 10, 70, 80);// Text wraps within text box

    }

    void webSocketServerEvent(String msg){

      println(msg);

    }

【问题讨论】:

  • 在“测试”之后,您没有为 msg 分配任何值,因此它无法在任何地方更改。您的意思是在活动中分配它吗?
  • 谢谢,我不太清楚如何分配它以便它在绘图函数中更新。它说 text(msg, 10, 10, 70, 80) 的地方是我希望来自 void webSocketServerEvent 的值更新处理 java 窗口中显示的文本。目前它只是在该窗口中显示测试,但没有使用来自 websocket 的新信息进行更新。
  • msg 的值正在更新 void webSocketServerEvent(String msg){ println(msg);因为当你对着麦克风说话时,它会在控制台窗口中打印出正在处理的结果,但它没有被 void draw(){ } 捕获
  • 不,那只是接收它并打印它。它没有存储在任何地方。您可能希望在该方法中添加 this.msg = msg; 以实际存储它。
  • 我尝试将其添加到 void setup()、void draw() 和 void webSocketServer() 中,但它们都没有任何区别。如果您有一个静态设置的 msg 变量,如控制台中出现的 test 和一个来自 void websocketServer 的动态变化变量(也是 msg),我无法理解为什么一个人不将另一个更新为相同的字符串名称两个都。 void websocketServer 是否应该在 text(msg, 10, 10, 70, 80) 之前先在 draw 函数中调用;使用 webSocketServer(msg);也许?

标签: websocket nullpointerexception processing


【解决方案1】:

您是否想问如何将草图级msg 变量分配给传递给webSocketServerEvent() 函数的msg 参数的值?

请注意,仅仅因为它们具有相同的名称并不意味着它们是相同的变量。它们是两个不同范围内的两个不同变量。如果要引用或重新分配草图级变量,可以使用this 关键字来消除歧义:

void webSocketServerEvent(String msg){
  this.msg = msg;
  println(msg);
}

或者您可以只重命名变量之一:

void webSocketServerEvent(String webSocketMessage){
  this.msg = webSocketMessage;
  println(msg);
}

【讨论】:

  • 我都试过了,但都没有改变控制台中“test”字符串的值。你在哪里写 this.msg = webSocketMessage; 似乎并不重要输出始终是 java 窗口中的单词“test”。但是语音记录会将控制台消息更改为您对麦克风说的任何内容。我有些需要捕获该字符串而不是在 void setup() 中定义的静态字符串?
  • @undesignuk 从更简单的开始。创建一个默认显示“test”的草图,并在单击鼠标后将其切换为“clicked”。先让它工作。如果您无法使其正常工作,请将您的代码作为minimal reproducible example 发布在新的问题帖子中。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2014-04-03
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
相关资源
最近更新 更多