Ошибка Java: Исключение в потоке "основной" java.lang.NullPointerException - PullRequest
0 голосов
/ 26 января 2010

Вот код:

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? Пожалуйста, помогите

Ответы [ 8 ]

5 голосов
/ 26 января 2010
Exception in thread "main" java.lang.NullPointerException
    at jmfcam05v.startCapture(jmfcam05v.java:202)

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

1010 * Е.Г. *

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!
}
1 голос
/ 26 января 2010

Здесь виновата плохая обработка исключений.

Скорее всего, элемент processor не инициализируется. Если нет процессора, похоже, что вы ничего не можете сделать полезного. Так что позвольте исключению вылететь, прервав вашу обреченную программу в этот момент, вместо того, чтобы «проглотить» его и беспечно продолжить.

Кроме того, если вы собираетесь есть исключения и использовать солдат, хотя бы напечатайте их правильно: ex.printStackTrace() вместо System.out.println(ex).

Но было бы гораздо лучше добавить в свои методы предложения throws и не перехватывать никаких исключений, поскольку вы не можете восстановить их.


Возможно, кодек Indeo присутствовал на вашем компьютере с Windows XP, но недоступен на вашем компьютере с Vista. ( Обновление: Фактически, Indeo не поддерживается и не совместим с Vista. ) Это препятствует успешному созданию processor, и ваша программа обречена с этого момента. Есть ли способ проверить, является ли конкретный FileTypeDescriptor или VideoFormat действительным во время выполнения?

1 голос
/ 26 января 2010

NPE это просто. Одна из линий

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

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

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

EDIT

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

0 голосов
/ 30 декабря 2013

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

0 голосов
/ 28 мая 2012

Удалить это:

Processor processor = null;
DataSink datasink = null;

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

Processor processor;
DataSink datasink;
0 голосов
/ 26 января 2010

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

0 голосов
/ 26 января 2010

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

При попытке позвонить

datasink.close();

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

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

datasink = Manager.createDataSink(outputDS, ml);
0 голосов
/ 26 января 2010

Похоже, что эта строка:

processor = Manager.createRealizedProcessor(pm);

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

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

...