Ошибка Java: исключение в потоке «Main» java.lang.nullPointerException

StackOverflow https://stackoverflow.com/questions/2140959

  •  22-09-2019
  •  | 
  •  

Вопрос

Вот код:

import java.awt.*;
import java.util.*;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.control.*;
import javax.media.format.*;

public class jmfcam05v
{
       DataSource dataSource;
       PushBufferStream pbs;

       Vector camImgSize = new Vector();
       Vector camCapDevice = new Vector();
       Vector camCapFormat = new Vector();

       int camFPS;
       int camImgSel;

       Processor processor = null;
       DataSink datasink = null;

       public static void main(String[] args)
       {
               jmfcam05v jmfcam = new jmfcam05v();
       }

       public jmfcam05v()
       {

               fetchDeviceFormats();
 camFPS = 30;    // framerate


               fetchDeviceDataSource();
               createPBDSource();
               createProcessor(dataSource);
               startCapture();
               try{Thread.sleep(20000);}catch(Exception e){}   // 20 seconds
               stopCapture();
       }

      boolean fetchDeviceFormats()
       {
               Vector deviceList = CaptureDeviceManager.getDeviceList(new VideoFormat(null));
               CaptureDeviceInfo CapDevice = null;
               Format CapFormat = null;
               String type = "N/A";

               CaptureDeviceInfo deviceInfo=null;boolean VideoFormatMatch=false;
               for(int i=0;i<deviceList.size();i++)
               {
                       // search for video device
                       deviceInfo = (CaptureDeviceInfo)deviceList.elementAt(i);
                       if(deviceInfo.getName().indexOf("vfw:")<0)continue;

                       Format deviceFormat[] = deviceInfo.getFormats();
                       for (int f=0;f<deviceFormat.length;f++)
                       {
                               if(deviceFormat[f] instanceof RGBFormat)type="RGB";
                               if(deviceFormat[f] instanceof YUVFormat)type="YUV";
                               if(deviceFormat[f] instanceof JPEGFormat)type="JPG";

                               Dimension size = ((VideoFormat)deviceFormat[f]).getSize();
                               camImgSize.addElement(type+" "+size.width+"x"+size.height);

                               CapDevice = deviceInfo;
                               camCapDevice.addElement(CapDevice);
                               //System.out.println("Video device = " + deviceInfo.getName());

                               CapFormat = (VideoFormat)deviceFormat[f];
                               camCapFormat.addElement(CapFormat);
                               //System.out.println("Video format = " + deviceFormat[f].toString());

                               VideoFormatMatch=true;  // at least one
                       }
               }
               if(VideoFormatMatch==false)
               {
                       if(deviceInfo!=null)System.out.println(deviceInfo);
                       System.out.println("Video Format not found");
                       return false;
               }

               return true;
       }


       void fetchDeviceDataSource()
       {
               CaptureDeviceInfo CapDevice =
(CaptureDeviceInfo)camCapDevice.elementAt(camImgSel);
               System.out.println("Video device = " + CapDevice.getName());
               Format CapFormat = (Format)camCapFormat.elementAt(camImgSel);
               System.out.println("Video format = " + CapFormat.toString());

               MediaLocator loc = CapDevice.getLocator();
               try
               {
                       dataSource = Manager.createDataSource(loc);
               }
               catch(Exception e){}

               try
               {
                       FormatControl formCont=((CaptureDevice)dataSource).getFormatControls()[0];
                       VideoFormat formatVideoNew = new
VideoFormat(null,null,-1,null,(float)camFPS);
                       formCont.setFormat(CapFormat.intersects(formatVideoNew));
               }
               catch(Exception e){}
       }

       void createPBDSource()
       {
               try
               {
                       pbs=((PushBufferDataSource)dataSource).getStreams()[0];
               }
               catch(Exception e){}
       }

       public void createProcessor(DataSource datasource)
       {
               FileTypeDescriptor ftd = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO);
               Format[] formats = new Format[] {new VideoFormat(VideoFormat.INDEO50)};
               ProcessorModel pm = new ProcessorModel(datasource, formats, ftd);
               try
               {
                       processor = Manager.createRealizedProcessor(pm);
               }
               catch(Exception me)
               {
                       System.out.println(me);
                       // Make sure the capture devices are released
                       datasource.disconnect();
                       return;
               }
       }

       private void startCapture()
       {
               // Get the processor's output, create a DataSink and connect the two.
               DataSource outputDS = processor.getDataOutput();
               try
               {
                       MediaLocator ml = new MediaLocator("file:capture.mpg");
                       datasink = Manager.createDataSink(outputDS, ml);
                       datasink.open();
                       datasink.start();
               }catch (Exception e)
               {
                       System.out.println(e);
               }
               processor.start();
               System.out.println("Started saving...");
       }

       private void pauseCapture()
       {
               processor.stop();
       }

       private void resumeCapture()
       {
               processor.start();
       }

       private void stopCapture()
       {
               // Stop the capture and the file writer (DataSink)
               processor.stop();
               processor.close();
               datasink.close();
               processor = null;
               System.out.println("Done saving.");
       }
}

Ошибка:

бежать:

Video device = vfw:Microsoft WDM Image Capture (Win32):0
Video format = YUV Video Format: Size = java.awt.Dimension[width=640,height=480] MaxDataLength = 614400 DataType = class [B yuvType = 32 StrideY = 1280 StrideUV = 1280 OffsetY = 0 OffsetU = 1 OffsetV = 3

javax.media.CannotRealizeException: Unable to provide all requested tracks
Exception in thread "main" java.lang.NullPointerException
        at jmfcam05v.startCapture(jmfcam05v.java:202)
        at jmfcam05v.(jmfcam05v.java:82)
        at jmfcam05v.main(jmfcam05v.java:64)

Пожалуйста, помогите мне с этой ошибкой. Я использую ОС Windows Vista.

Кто -нибудь может предложить мне, как хранить файлы в формате .3GP? Пожалуйста, помогите

Это было полезно?

Решение

Exception in thread "main" java.lang.NullPointerException
    at jmfcam05v.startCapture(jmfcam05v.java:202)

Некоторая ссылка на объект в строке 202 jmfcam05v.java, внутри startCapture() Метод, есть null Пока код пытается получить доступ/вызвать его, используя точку . оператор.

Например

SomeObject someObject = null;
someObject.doSomething(); // NullPointerException.

Решение на самом деле легко. Просто убедитесь, что он не является нулевым, создавая его:

if (someObject == null) {
    someObject = new SomeObject();
}
someObject.doSomething(); // No NPE more!

... или просто сделав нулевую пробку перед доступом/вызовом:

if (someObject != null) {
    someObject.doSomething(); // No NPE more!
}

Другие советы

NPE легко. Одна из строк

MediaLocator ml = new MediaLocator("file:capture.mpg");
datasink = Manager.createDataSink(outputDS, ml);

в методе StartCapture бросает CannotRealizeException. Анкет Так datasink не инициализируется, и если вы попытаетесь закрыть его позже в stopCapture, это все еще null И это вызывает NPE.

Чтобы избежать NPE: проверить, если datasink не нулевой, прежде чем называть метод на нем.

РЕДАКТИРОВАТЬ

И не могли бы вы ПОЖАЛУЙСТА Удалите логику приложения из конструктора и переместите ее в основной метод. Конструктор предназначен для построения объекта, главным образом для инициализации классов и ничего больше. И классы Java должны начинаться с заглавного письма, которое помогает людям (и нами) понять код.

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, this.imagetexture.unit);
    GLES20.glUniform1i(ShaderCache.activeShader.texture, this.imagetexture.unit);
.

Я считаю, что это неправильно.Однородное значение Sampler2D, которое вы проходите к GLSL, должны быть числом sampler , а не идентификатор текстуры.Если вы связываете текстуру ID 3 для Sampler 0 (GlactiveTexture (GL_Texture0)), то вы проходите 0 к равномерной Sampler2D, а не 3. Если вы связываете текстуру к GL_Texture1, то значение Sampler2D становится 1 и т. Д.

Выглядит так, как будто эта линия:

processor = Manager.createRealizedProcessor(pm);

Бросает а CannotRealizeException, вызывая processor быть нулевым и привести к NPE позже. Что касается того, что это исключение, это, кажется, имеет отношение к вашим данным и использованию JMF.

Как правило, это плохо использовать System.out.println() На исключениях, потому что тогда вы теряете трассировку стека, что часто является наиболее важной информацией для отладки. Вместо. использовать exception.printStackTrace();

DataSink никогда не инициализируется.

Когда вы пытаетесь позвонить

datasink.close();

Это говорит, что наборы данных нулевой.

Убедитесь, что ваш код на самом деле попадает и обрабатывает строку № 176

datasink = Manager.createDataSink(outputDS, ml);

Глядя на private void startCapture() Метод, я думаю processor переменная NULL Поскольку это единственное, что нет в try-catch блокировать.

Удали это :

Processor processor = null;
DataSink datasink = null;

и заменить на это:

Processor processor;
DataSink datasink;

Это связано с тем, что безреализованный процессор не может работать на устройстве VedioCapture. Проблема с устройством Microsoft WDM Image.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top