2015-06-10 3 views
1

Прежде всего я новичок в Java, поэтому прошу прощения, если это очевидный ответ.Обработка в Java Последовательный объект Null Pointer Exception

Я использую обработку на Java для чтения входных значений, поступающих из порта USB.

Вот пользовательский класс, который я настроил для получения значений. Я вызываю метод getCurrentValue() и выдает исключение 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; 
    } 
} 

Он бросает ошибку из-за линии 40 в seisPort.available() Сообщение об ошибке:

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 

я застрял на это некоторое время, любая обратная связь ценится.

ответ

3

Посмотрите на конструкторе:

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

Обратите внимание, что вы включили пустое ключевое слово в сигнатуре метода. Конструкторы не имеют типа возврата, поэтому это будет рассматриваться как метод вместо конструктора. Это будет не вызывается при создании нового экземпляра Seismograph, поэтому ваш seisPort имеет значение NULL.

Чтобы исправить это, просто удалите ключевое слово void.

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

Спасибо за быстрый ответ и объяснение. В противном случае я бы бегал по кругу. –

3

В своей подписи к конструктору не должно быть void. Поскольку java не видит допустимого конструктора, он создает пустой, называемый конструктором по умолчанию. Таким образом, seisPort не инициализируется, когда экземпляр создается, и ссылаясь на него, вызывает java, чтобы выкинуть NullPointerException.