1

First of all I am new to Java so I apologize if this is an obvious answer.

I am using Processing in Java to read the input values coming from a usb port.

Here is the custom class I set up to get the values. I call the getCurrentValue() method and it throws the NullPointerException.

import processing.core.PApplet;
import processing.serial.*; 

import java.util.HashMap; 
import java.util.ArrayList; 
import java.io.File; 
import java.io.BufferedReader; 
import java.io.PrintWriter; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 

public class Seismograph extends PApplet{

    private int currentValue, verticalOffset = 0;
    private int zero = 32768;                                                                                      // .5 of maximum seismograph value
    private int adjustSeis = 68;                                                                                   // devide seismograph data by adjustSies to scale
    public String theSeisPort = "COM20";
    private Serial seisPort;  

    public void Seismograph(){
      currentValue = 0;
      seisPort = new Serial(this, "COM20", 38400);
    }


    public int getCurrentValue(){
        byte[] inBuffer = new byte[2];                                                                       // value for seis - 2 bytes

        while (seisPort.available() > 0) {                                                                   // verify serial port
          inBuffer = seisPort.readBytes();
          seisPort.readBytes(inBuffer);                                                                      // read bytes into buffer

        if (inBuffer != null)  {
            String seisString = new String(inBuffer);                                                        // capture value
            float seisFloat = PApplet.parseFloat(seisString);                                                             // convert value to float
            int seisInt = PApplet.parseInt((seisFloat-zero)/adjustSeis);                                                  // adjust data to fit screen
            seisInt = seisInt+(height/2)-verticalOffset;                                                     // center data vertically
            currentValue = seisInt;
            }

        }
        return this.currentValue;
    }
}

It throws the error because of line 40 at seisPort.available() The error message:

Exception in thread "Animation Thread" 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 vialab.SMT.renderer.PGraphics3DDelegate.requestDraw(PGraphics3DDelegate.java:1450)
    at processing.core.PApplet.run(PApplet.java:2254)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.NullPointerException
    at seismic.Seismograph.getCurrentValue(Seismograph.java:40)
    at seismic.seismograph_jan22c_1_1.draw(seismograph_jan22c_1_1.java:102)
    at processing.core.PApplet.handleDraw(PApplet.java:2384)
    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$10.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$11.run(GLCanvas.java:1300)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

I have been stuck on this for awhile, any feedback is appreciated.

0

2 Answers 2

3

Look at your constructor:

public void Seismograph(){
      currentValue = 0;
      seisPort = new Serial(this, "COM20", 38400);
}

Notice that you've included a void keyword in the method signature. Constructors do not have a return type, so this will be treated as a method instead of a constructor. This will not be called when you create a new instance of Seismograph, so your seisPort is null.

To fix this, simply remove the void keyword.

public Seismograph(){
      currentValue = 0;
      seisPort = new Serial(this, "COM20", 38400);
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the quick reply and explanation. I would have been running around in circles otherwise.
3

The constructor shouldn't have void in its signature. Since java doesn't see a valid constructor, it creates an empty one, called the default constructor. Thus, seisPort isn't initialized when an instance is created, and referring to it causes java to throw a NullPointerException.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.