gpt4 book ai didi

java - 尝试将变量添加到新对象时发生InvocationTargetException

转载 作者:行者123 更新时间:2023-12-01 23:15:16 27 4
gpt4 key购买 nike

我正在尝试使用oscP5库将两个变量从一个草图发送到另一个草图。
我发送的消息是这样创建的:

 OscMessage myMessage = new OscMessage("/test");
myMessage.add(title);
myMessage.add("Zeit");
oscP5.send(myMessage, remoteLocation);


在第二个草图中,我收到这样的数据:

 void oscEvent(OscMessage theOscMessage) {
if(theOscMessage.checkAddrPattern("/test")) {
String title = theOscMessage.get(0).stringValue();
String layoutType = theOscMessage.get(1).stringValue();

addToQueue(title, layoutType);
}
}


这是我简化的addToQueue函数:

 void addToQueue(String title, String layoutType) {
if(!existsInQueues(title)) {
upcomingHeadlines.add(new Headline(title, printAxis, scrollSpeed, layoutType));
}
}


每次启动草图时,都会出现错误:


  错误@ OscP5错误。将OscMessage转发到程序中的方法时发生错误。请检查您的代码,以了解解析传入的OscMessages的方法中可能发生的任何可能的错误,例如检查是否有转换错误,可能的空指针,数组溢出...。
  负责的方法:oscEvent java.lang.reflect.InvocationTargetException


我已经能够将问题追踪到 layoutType -Variable。如果我改变

  String layoutType = theOscMessage.get(1).stringValue();




  String layoutType = "Zeit";


没有错误发生。
这非常令人困惑,因为两个版本的结果应该相同。
该错误信息对我没有任何帮助。



编辑

我已经比较了两个可能的变量:

String layoutType = theOscMessage.get(1).stringValue();
String layoutTypeB = "Zeit";
if(layoutType.equals(layoutTypeB)) println("Same String!");


由于要打印到控制台,所以两者必须相同...我真的不知道从哪里搜索错误了。



编辑2

我已经将第二个草图包裹在 try {...} catch(Exception ex) {ex.printStackTrace();}中,如下所示:

void oscEvent(OscMessage theOscMessage) {
try {
if(theOscMessage.checkAddrPattern("/test")) {
if(debug && debugFeed) println("Received message from other sketch.");

String title = theOscMessage.get(0).stringValue();
String layoutTypeO = (String)theOscMessage.get(1).stringValue();
String layoutType = "Zeit";
if(debug && debugTemp) {
if(layoutType.equals(layoutTypeO)) println("IS DOCH GLEICH!");
}
if(debug && debugFeed) println("Parsed Information.");
if(debug && debugFeed) println("-----");
addToQueue(title, layoutTypeO);
}
} catch(Exception ex) {ex.printStackTrace();}
}


这给了我这个错误:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0  
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at printer$Headline.useLayout(printer.java:260)
at printer$Headline.<init>(printer.java:188)
at printer.addToQueue(printer.java:407)
at printer.oscEvent(printer.java:395)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at oscP5.OscP5.invoke(Unknown Source)
at oscP5.OscP5.callMethod(Unknown Source)
at oscP5.OscP5.process(Unknown Source)
at oscP5.OscNetManager.process(Unknown Source)
at netP5.AbstractUdpServer.run(Unknown Source)
at java.lang.Thread.run(Thread.java:744)




编辑4

我的 Headline -Class的构造函数:

class Headline {

//Define Variables
Layout layout;
String title, lastHeadline;
float yPos, speed;
float transparency = 255;
boolean fullyPrinted = false;
int boundingBoxHeight;

// Initialize Class Function
Headline(String t, float y, float s, String lay) {
title = t;
yPos = y;
speed = s;
layout = useLayout(lay);
boundingBoxHeight = calculateTextHeight(title);
}


您可能还想了解 useLayout(),所以这里是:

Layout useLayout(String name) {
ArrayList layoutVariants = new ArrayList<Layout>();
int existingLayouts = layouts.size();
Layout chosenLayout;

for(int i = 0; i < existingLayouts; i++) {
Layout currentLayout = (Layout)layouts.get(i);
if(currentLayout.layoutType == name) {
layoutVariants.add(currentLayout);
}
}

if(layoutVariants != null) {
int rand = (int)(Math.random() * layoutVariants.size());
chosenLayout = (Layout)layoutVariants.get(rand);
} else {
chosenLayout = (Layout)layouts.get((int)(Math.random() * existingLayouts));
}
return chosenLayout;
}

最佳答案

您的代码有两个问题,它们都在您的useLayout方法中。

第一个问题是您没有在此行上正确比较Strings

    if(currentLayout.layoutType == name) {


nameString,我认为 currentLayout.layoutType也是。两个相等但不相同的 String==下不会比较相等。因此,您的 layoutVariants列表很可能在 for循环结束时为空。

该行应显示为:

    if(currentLayout.layoutType.equals(name)) {


See also this question

第二个问题是您没有正确处理 layoutVariants列表为空的情况。问题是在这条线上:

    if(layoutVariants != null) {


layoutVariants永远不会为空,因此该 else语句的 if分支将永远不会执行。因为 layoutVariants.size()将为零,所以 rand将始终为零。尝试获取空ArrayList中索引0处的元素将为您提供正好显示的 IndexOutOfBoundsException

我想如果不识别给定的布局名称,换句话说,如果 else列表为空而不是null,则您希望执行 layoutVariants块。在这种情况下,请将此行更改为

    if(!layoutVariants.isEmpty()) {


注意 !之前的 layoutVariants(非运算符)。如果 if元素不为空,则希望运行 layoutVariants语句下的代码。

根据您的评论进行编辑: null ArrayList与空列表非常不同。 null是一个特殊值,表示该变量没有给定类型的对象。

让我们尝试一个真实的类比:一个购物袋。如果您有一个空袋子,或者根本没有袋子,那么您都不会购物。但是,您可以将东西装进一个空袋子,例如,计算其中包含多少物品。如果没有袋子,那么在其中放入物品就没有意义,因为没有袋子可以放入物品。 null表示没有行李的情况。

类似地, String是字符的集合,即使不包含任何字符,字符集合也可以存在。

isEmpty()可以用于 any collection,如果使用Java 6或更高版本,则可以使用 Strings as well。我顶不上任何其他具有 isEmpty方法的类。您只需要参考这些类的文档来查找。

我处理Processing的工作不多,但是我知道Processing是基于Java构建的,因此我希望任何标准的Java方法都能工作。另外,我也不必担心“清除”变量:JVM通常非常擅长在您清除之后。在这方面,您的代码肯定没有错。

编辑2以回应您的进一步评论: ArrayList arr;声明类型为 ArrayList的变量。但是,变量 arr尚未初始化:它没有值(甚至没有 null),并且在为变量赋值之前尝试读取该变量的值是错误的:

ArrayList arr;
System.out.println(arr); // compiler error: arr might not have been initialised.


分配 null然后代码将编译:

ArrayList arr = null;
System.out.println(arr); // prints 'null'.


通常不需要声明变量而不给它命名,但是一种常见的情况是要在 if语句的两侧为同一变量分配不同的值。以下代码无法编译:

int y = getMeSomeInteger();   // assume this function exists
if (y == 4) {
int x = 2;
} else {
int x = 5;
}
System.out.println(x); // compiler error: cannot find symbol x


无法编译的原因是,每个变量 x仅在包含它的大括号 {}中可用。在底部,两个变量 x都不可用,因此会出现编译器错误。

我们需要进一步声明 x。我们可以改写以下内容:

int y = getMeSomeInteger();   // assume this function exists
int x = 0;
if (y == 4) {
x = 2;
} else {
x = 5;
}
System.out.println(x);


该代码可以编译并运行,但是从未使用最初分配给 0的值 x。这样做没有多大意义,我们可以通过声明变量而不是立即给它赋值来摆脱未使用的值。

int y = getMeSomeInteger();   // assume this function exists
int x;
if (y == 4) {
x = 2;
} else {
x = 5;
}
System.out.println(x);

关于java - 尝试将变量添加到新对象时发生InvocationTargetException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21335998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com