java.lang.NullPointerException 在处理中具有自定义 class
java.lang.NullPointerException with a custom class in Processing
好吧,我是编程新手,所以我的基础知识不是很清楚(我的英语也很糟糕)。当我开始这段代码时,我想让它画一些点,让它们移动,如果它们之间的距离比 X 近,则画一条线。但我想让它变得更复杂一点,然后添加另一个 class,目的是不与另一个 class 交互并画一个圆和旁边的一些,限制在一个矩形内(我试图将它们限制在一个圆圈内,但……现在对我来说太多了)。好吧,问题是我认为代码是“"clear"”,至少对于 PC 来说是这样,我不知道为什么我会收到这个 "java.lang.NullPointerException" 错误,因为它没有显示我哪里出错了。
任何帮助将不胜感激。
//Test nº1. An array of spheres which are randomly moving, connected between them if the distance is less than 50p.
//The spheres' starting position are determined by the red(x) and green(y) color space from colordata from images.
int[] tots = {#2d2a33, #8e8397, #160e19, #8263a9, #0f1723, #737a86, #2d2a33, #8e8497, #15101c, #965555, #1a2940, #9b7873, #080b12, #272b41, #211f33, #8b6659,
#070719, #4c5985, #423444, #9c8696, #1a2d13, #799078, #30160e, #da9c7b, #2c2e3a, #6d798e, #28474f, #b63f10, #040c1a, #cf6c24, #442036, #a87d99,
#19191a, #756d6e, #1a2828, #94b1a2, #060c15, #6d98c1, #284062, #9ab9be, #121720, #abb7c5, #6e6b9b, #282033};
//--Malla--
float xo, yo;
int numMalla = 200;
Malla[] ma = new Malla [numMalla];
float x;
float y;
float angle = 0.0; // Direction of motion
//float speed = random(0.2, 0.8); // Speed of motion
float diameter = 0.0;
//----
//--Errant--
int numPiEr = 10;
int e;
float xoEr = width/2;
float yoEr = height/2;
float xoPiEr = xoEr;
float yoPiEr = yoEr;
float cRotO = 0;
Errant ccEr;
//Errant clEr;
Errant[] piEr = new Errant [numPiEr];
//----
void setup() {
//--Malla--
//coords mapping into the original position
xo = map( (tots[int(random(0,tots.length))]& 0xFF0000)>>16, 0, 255, 0, width);
yo = map( (tots[int(random(0,tots.length))]& 0x00FF00)>>8, 0, 255, 0, height);
//----
size(1024, 768,P2D);
background(0);
smooth();
frameRate(25);
//float rad = random(5.0,150.0);
//--Malla--
for (int i = 0; i < ma.length; i++) {
ma[i] = new Malla(random(10,width-10),random(10,height-10),angle);
}
//----
//--Errant--
Errant ccEr = new Errant (xoEr, yoEr, cRotO);
//Errant clEr = new Errant (xoEr, yoEr, cRotO);
for (int e = 0; e < piEr.length; e++) {
piEr[e] = new Errant(xoPiEr, yoPiEr, cRotO);
}
//----
}
void draw() {
background(0);
for (int i = 0; i < ma.length; i++) {
ma[i].maMove();
for (int j = i + 1; j < ma.length; j++) {
if (ma[i].nearAnotherMalla(ma[j])) {
ma[i].highlight();
}
}
ma[i].display();
}
for (int e = 0; e < piEr.length; e++) {
piEr[e].piErMove();
piEr[e].piErDisplay();
}
ccEr.erMove();
ccEr.errDisplay();
}
class Malla {
float x,y;
float diameter;
float speedX, speedY;
float angle;
//int temps;
//color c = color(255);
Malla[] nearMalla = new Malla[numMalla];
//----
Malla(float xpos, float ypos, float dir) {
xo = x;
yo = y;
x = xpos;
y = ypos;
//speedX = random(-0.2, 0.2);
//speedY = random(-0.2, 0.2);
speedX = random(-2, 2);
speedY = random(-2, 2);
//temps=0;
//diameter = random(5, 13);
diameter = 2.5;
angle = dir;
}
//----
void maMove() {
/* if(temps==10){
speedX = random(-2, 2);
speedY = random(-2, 2);
temps=0;
}
++temps;*/
if(x+diameter >= width+20) {
speedX = -speedX;
}
else if(x+diameter <= -20) {
speedX = -speedX;
}
if(y+diameter >= height+20) {
speedY = -speedY;
}
else if(y+diameter <= -20) {
speedY = -speedY;
}
// angle += random(-0.13, 0.13);
/* x += speedX;
y += speedY;*/
angle += random(-0.13, 0.13);
x += cos(angle) * speedX;
y += sin(angle) * speedY;
}
//----
void highlight() {
//c = color(255,100);
stroke(255,1);
for (int i = 0; i < ma.length; i++) {
if (nearMalla[i] != null) {
line(x, y, nearMalla[i].x, nearMalla[i].y);
}
}
}
//----
void display() {
//stroke(c);
noStroke();
//noFill();
fill(255);
ellipse(x,y,diameter,diameter);
//c = color(0);
}
//----
boolean nearAnotherMalla(Malla b) {
boolean near = dist(x,y,b.x,b.y) <= 60;
for (int i = 0; i < ma.length; i++) {
if (near) {
nearMalla[i] = b;
}
else {
nearMalla[i] = null;
}
}
return near;
}
}
这是行不通的,单个对象
class Errant {
float xEr, yEr, xPiEr, yPiEr, cRot, velEr, velErX, velErY, velPiEr, velPiErX, velPiErY;
int ccDiam, clDiamX, clDiamY, piErDiam;
Errant[] nearPiEr = new Errant[numPiEr];
//----
Errant(float xEr, float yEr, float cRot) {
ccDiam = 15;
clDiamX = 80;
clDiamY = 70;
xEr = xoEr;
yEr = yoEr;
xPiEr = random((xEr-20),(xEr+20));
yPiEr= random((yEr-20), (yEr+20));
cRot = cRotO;
velEr = random(-3,3);
velEr = velErX = velErY;
velPiEr = random(-1.5,1.5);
velPiEr = velPiErX = velPiErY;
}
void erMove() {
if(xEr+clDiamX >= width+100) {
velErX = -velErX;
}
else if(xEr+clDiamX <= -100) {
velErX = -velErX;
}
if(yEr+clDiamX >= height+100) {
velErY = -velErY;
}
else if(yEr+clDiamX <= -100) {
velErY = -velErY;
}
cRot += random(-0.2,0.2);
xEr = cos(cRot)*velEr;
yEr = sin(cRot)*velEr;
}
void piErMove() {
if(xPiEr >= xEr+clDiamX) {
velErX = -velPiErX;
}
else if(xPiEr <= xEr-clDiamX) {
velErX = -velPiErX;
}
if(yPiEr >= yEr+clDiamY) {
velErY = -velPiErY;
}
else if(yPiEr <= xEr-clDiamY) {
velErY = -velPiErY;
}
xPiEr = cos(cRot)*velPiEr;
yPiEr = sin(cRot)*velPiEr;
}
void errDisplay () {
noStroke();
fill(#EFE4B0, 70);
ellipse(xEr, yEr, 10, 10);
}
void piErDisplay () {
fill(#EFC6B0, 50);
ellipse(xPiEr, yPiEr, 1, 1);
}
}
提前致谢,girald0。
这是我在控制台中收到的错误消息:
java.lang.RuntimeException: java.lang.NullPointerException
at com.jogamp.common.util.awt.AWTEDTExecutor.invoke(AWTEDTExecutor.java:58)
at jogamp.opengl.awt.AWTThreadingPlugin.invokeOnOpenGLThread(AWTThreadingPlugin.java:103)
at jogamp.opengl.ThreadingImpl.invokeOnOpenGLThread(ThreadingImpl.java:206)
at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:172)
at javax.media.opengl.Threading.invoke(Threading.java:191)
at javax.media.opengl.awt.GLCanvas.display(GLCanvas.java:541)
at processing.opengl.PJOGL.requestDraw(PJOGL.java:688)
at processing.opengl.PGraphicsOpenGL.requestDraw(PGraphicsOpenGL.java:1651)
at processing.core.PApplet.run(PApplet.java:2256)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at punts_moviment_mapejats2.draw(punts_moviment_mapejats2.java:111)
at processing.core.PApplet.handleDraw(PApplet.java:2386)
at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649)
at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1289)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994)
at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1300)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Processing 首先运行 sketch() 方法,然后连续运行 draw() 方法。如果您不想根据我对您的问题的评论深入研究实际的 .java 源代码,您可以开始在设置中评论内容并绘图,直到您的草图再次运行,这将指向有问题的行。
问题似乎出在第 94 行:
ccEr.erMove();
ccEr 为空。
你定义这个变量两次,一次在第 37 行:
Errant ccEr;
第 63 行:
Errant ccEr = new Errant (xoEr, yoEr, cRotO);
处理似乎只考虑第一个(第 37 行),而在那个你实际上并没有创建对象,只是一个名为 ccEr 的变量,里面没有任何内容(如果你愿意,可以为 null)
现在,我注释了第 37 行,然后它根本找不到变量!这让我感到困惑,因为我知道您可以在任何地方定义 "global" 变量。显然,Processing 的内部 hocus-pocus 已更改,因此您必须在 setup()...
上方传输第 63 行(您定义和创建 ccEr 的地方)
好吧,我是编程新手,所以我的基础知识不是很清楚(我的英语也很糟糕)。当我开始这段代码时,我想让它画一些点,让它们移动,如果它们之间的距离比 X 近,则画一条线。但我想让它变得更复杂一点,然后添加另一个 class,目的是不与另一个 class 交互并画一个圆和旁边的一些,限制在一个矩形内(我试图将它们限制在一个圆圈内,但……现在对我来说太多了)。好吧,问题是我认为代码是“"clear"”,至少对于 PC 来说是这样,我不知道为什么我会收到这个 "java.lang.NullPointerException" 错误,因为它没有显示我哪里出错了。
任何帮助将不胜感激。
//Test nº1. An array of spheres which are randomly moving, connected between them if the distance is less than 50p.
//The spheres' starting position are determined by the red(x) and green(y) color space from colordata from images.
int[] tots = {#2d2a33, #8e8397, #160e19, #8263a9, #0f1723, #737a86, #2d2a33, #8e8497, #15101c, #965555, #1a2940, #9b7873, #080b12, #272b41, #211f33, #8b6659,
#070719, #4c5985, #423444, #9c8696, #1a2d13, #799078, #30160e, #da9c7b, #2c2e3a, #6d798e, #28474f, #b63f10, #040c1a, #cf6c24, #442036, #a87d99,
#19191a, #756d6e, #1a2828, #94b1a2, #060c15, #6d98c1, #284062, #9ab9be, #121720, #abb7c5, #6e6b9b, #282033};
//--Malla--
float xo, yo;
int numMalla = 200;
Malla[] ma = new Malla [numMalla];
float x;
float y;
float angle = 0.0; // Direction of motion
//float speed = random(0.2, 0.8); // Speed of motion
float diameter = 0.0;
//----
//--Errant--
int numPiEr = 10;
int e;
float xoEr = width/2;
float yoEr = height/2;
float xoPiEr = xoEr;
float yoPiEr = yoEr;
float cRotO = 0;
Errant ccEr;
//Errant clEr;
Errant[] piEr = new Errant [numPiEr];
//----
void setup() {
//--Malla--
//coords mapping into the original position
xo = map( (tots[int(random(0,tots.length))]& 0xFF0000)>>16, 0, 255, 0, width);
yo = map( (tots[int(random(0,tots.length))]& 0x00FF00)>>8, 0, 255, 0, height);
//----
size(1024, 768,P2D);
background(0);
smooth();
frameRate(25);
//float rad = random(5.0,150.0);
//--Malla--
for (int i = 0; i < ma.length; i++) {
ma[i] = new Malla(random(10,width-10),random(10,height-10),angle);
}
//----
//--Errant--
Errant ccEr = new Errant (xoEr, yoEr, cRotO);
//Errant clEr = new Errant (xoEr, yoEr, cRotO);
for (int e = 0; e < piEr.length; e++) {
piEr[e] = new Errant(xoPiEr, yoPiEr, cRotO);
}
//----
}
void draw() {
background(0);
for (int i = 0; i < ma.length; i++) {
ma[i].maMove();
for (int j = i + 1; j < ma.length; j++) {
if (ma[i].nearAnotherMalla(ma[j])) {
ma[i].highlight();
}
}
ma[i].display();
}
for (int e = 0; e < piEr.length; e++) {
piEr[e].piErMove();
piEr[e].piErDisplay();
}
ccEr.erMove();
ccEr.errDisplay();
}
class Malla {
float x,y;
float diameter;
float speedX, speedY;
float angle;
//int temps;
//color c = color(255);
Malla[] nearMalla = new Malla[numMalla];
//----
Malla(float xpos, float ypos, float dir) {
xo = x;
yo = y;
x = xpos;
y = ypos;
//speedX = random(-0.2, 0.2);
//speedY = random(-0.2, 0.2);
speedX = random(-2, 2);
speedY = random(-2, 2);
//temps=0;
//diameter = random(5, 13);
diameter = 2.5;
angle = dir;
}
//----
void maMove() {
/* if(temps==10){
speedX = random(-2, 2);
speedY = random(-2, 2);
temps=0;
}
++temps;*/
if(x+diameter >= width+20) {
speedX = -speedX;
}
else if(x+diameter <= -20) {
speedX = -speedX;
}
if(y+diameter >= height+20) {
speedY = -speedY;
}
else if(y+diameter <= -20) {
speedY = -speedY;
}
// angle += random(-0.13, 0.13);
/* x += speedX;
y += speedY;*/
angle += random(-0.13, 0.13);
x += cos(angle) * speedX;
y += sin(angle) * speedY;
}
//----
void highlight() {
//c = color(255,100);
stroke(255,1);
for (int i = 0; i < ma.length; i++) {
if (nearMalla[i] != null) {
line(x, y, nearMalla[i].x, nearMalla[i].y);
}
}
}
//----
void display() {
//stroke(c);
noStroke();
//noFill();
fill(255);
ellipse(x,y,diameter,diameter);
//c = color(0);
}
//----
boolean nearAnotherMalla(Malla b) {
boolean near = dist(x,y,b.x,b.y) <= 60;
for (int i = 0; i < ma.length; i++) {
if (near) {
nearMalla[i] = b;
}
else {
nearMalla[i] = null;
}
}
return near;
}
}
这是行不通的,单个对象
class Errant {
float xEr, yEr, xPiEr, yPiEr, cRot, velEr, velErX, velErY, velPiEr, velPiErX, velPiErY;
int ccDiam, clDiamX, clDiamY, piErDiam;
Errant[] nearPiEr = new Errant[numPiEr];
//----
Errant(float xEr, float yEr, float cRot) {
ccDiam = 15;
clDiamX = 80;
clDiamY = 70;
xEr = xoEr;
yEr = yoEr;
xPiEr = random((xEr-20),(xEr+20));
yPiEr= random((yEr-20), (yEr+20));
cRot = cRotO;
velEr = random(-3,3);
velEr = velErX = velErY;
velPiEr = random(-1.5,1.5);
velPiEr = velPiErX = velPiErY;
}
void erMove() {
if(xEr+clDiamX >= width+100) {
velErX = -velErX;
}
else if(xEr+clDiamX <= -100) {
velErX = -velErX;
}
if(yEr+clDiamX >= height+100) {
velErY = -velErY;
}
else if(yEr+clDiamX <= -100) {
velErY = -velErY;
}
cRot += random(-0.2,0.2);
xEr = cos(cRot)*velEr;
yEr = sin(cRot)*velEr;
}
void piErMove() {
if(xPiEr >= xEr+clDiamX) {
velErX = -velPiErX;
}
else if(xPiEr <= xEr-clDiamX) {
velErX = -velPiErX;
}
if(yPiEr >= yEr+clDiamY) {
velErY = -velPiErY;
}
else if(yPiEr <= xEr-clDiamY) {
velErY = -velPiErY;
}
xPiEr = cos(cRot)*velPiEr;
yPiEr = sin(cRot)*velPiEr;
}
void errDisplay () {
noStroke();
fill(#EFE4B0, 70);
ellipse(xEr, yEr, 10, 10);
}
void piErDisplay () {
fill(#EFC6B0, 50);
ellipse(xPiEr, yPiEr, 1, 1);
}
}
提前致谢,girald0。
这是我在控制台中收到的错误消息:
java.lang.RuntimeException: java.lang.NullPointerException
at com.jogamp.common.util.awt.AWTEDTExecutor.invoke(AWTEDTExecutor.java:58)
at jogamp.opengl.awt.AWTThreadingPlugin.invokeOnOpenGLThread(AWTThreadingPlugin.java:103)
at jogamp.opengl.ThreadingImpl.invokeOnOpenGLThread(ThreadingImpl.java:206)
at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:172)
at javax.media.opengl.Threading.invoke(Threading.java:191)
at javax.media.opengl.awt.GLCanvas.display(GLCanvas.java:541)
at processing.opengl.PJOGL.requestDraw(PJOGL.java:688)
at processing.opengl.PGraphicsOpenGL.requestDraw(PGraphicsOpenGL.java:1651)
at processing.core.PApplet.run(PApplet.java:2256)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at punts_moviment_mapejats2.draw(punts_moviment_mapejats2.java:111)
at processing.core.PApplet.handleDraw(PApplet.java:2386)
at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649)
at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1289)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994)
at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1300)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Processing 首先运行 sketch() 方法,然后连续运行 draw() 方法。如果您不想根据我对您的问题的评论深入研究实际的 .java 源代码,您可以开始在设置中评论内容并绘图,直到您的草图再次运行,这将指向有问题的行。
问题似乎出在第 94 行:
ccEr.erMove();
ccEr 为空。
你定义这个变量两次,一次在第 37 行:
Errant ccEr;
第 63 行:
Errant ccEr = new Errant (xoEr, yoEr, cRotO);
处理似乎只考虑第一个(第 37 行),而在那个你实际上并没有创建对象,只是一个名为 ccEr 的变量,里面没有任何内容(如果你愿意,可以为 null)
现在,我注释了第 37 行,然后它根本找不到变量!这让我感到困惑,因为我知道您可以在任何地方定义 "global" 变量。显然,Processing 的内部 hocus-pocus 已更改,因此您必须在 setup()...
上方传输第 63 行(您定义和创建 ccEr 的地方)