2010-01-26 75 views
-3

这里是代码:Java错误:例外在线程 “主要” 显示java.lang.NullPointerException

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格式的文件,请帮助

+1

你*真的*需要压缩,简化和澄清这一点。 – 2010-01-26 16:50:58

+0

它是一个罗德岛民!你好。 – 2010-01-26 16:52:29

+4

叫我疯了,但我猜测202线上的东西是零.... – BlairHippo 2010-01-26 16:53:09

回答

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

一些对象引用在线的jmfcam05v.java 202,startCapture()方法内,是null而代码试图访问/使用点.操作员调用它。

E.g.

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

该解决方案实际上很简单。只要确保它不被任何实例它空:

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

...或者通过访问/调用之前简单地做一个nullcheck:

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

相同的程序工作正常与胜利xp – Ishan 2010-01-26 17:05:35

+1

因此?这个事实仍然不能解决问题:)只要检查一下这条线(或者至少给我们指出一条线,或者 - 更好地发布SSCCE:http://sscce.org)。您迄今为止给我们提供的信息基本上没有任何用处。我只给出了一个通用的答案,如何解决NPE问题,以便您可以进一步了解自己。 – BalusC 2010-01-26 17:06:31

0

看起来好像这行:

processor = Manager.createRealizedProcessor(pm); 

抛出一个CannotRealizeException,造成processor为空,并导致NPE稍后。至于抛出什么异常,这似乎与你的数据和JMF的使用有关。

通常,对异常使用System.out.println()是不好的,因为这样会丢失堆栈跟踪,这通常是调试的最重要信息。代替。使用exception.printStackTrace();

+0

相同的程序工作正常与赢得xp – Ishan 2010-01-26 17:06:00

1

的NPE是容易的。一个在方法startCapture线

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

的抛出一个CannotRealizeException。因此datasink未初始化,如果您稍后尝试在stopCapture后关闭它,它仍然是null并且导致NPE。

为避免NPE:测试,如果datasink在调用其上的方法之前不为null。

编辑

,可能你从构造函数中删除应用程序逻辑并将其移动到的主要方法。构造函数用于构造一个对象,主要用于初始化类成员,而不是别的。 Java类应该以大写字母开头,帮助人们(和我们)理解代码。

1

不好的异常处理是在这里责怪。

最有可能的是,processor成员未被初始化。如果没有处理器,看起来你不能做任何有用的事情。所以让异常飞起来,在那个时候终止你注定的计划,而不是“吞咽”它,并继续愉快地继续。另外,如果你打算吃异常和士兵,至少应正确打印:ex.printStackTrace(),而不是System.out.println(ex)

但是,将throws子句添加到您的方法会更好,并且不会捕获任何异常,因为您无法从中恢复。


也许Indeo编解码器是出现在你的Windows XP中,但不可用你的Vista机器上。 (更新:事实上,Indeo不受支持,not compatible with Vista.)这可以防止processor被成功创建,并且从那一点开始您的程序就注定要失败。有没有办法在运行时测试特定的FileTypeDescriptorVideoFormat是否有效

0

datasink永远不会被初始化。

当您尝试调用

datasink.close(); 

它说datasink为空。

确保您的代码实际上是越来越并加工生产线#176

datasink = Manager.createDataSink(outputDS, ml); 
0

通过查看private void startCapture()方法我猜processor变量是NULL因为这是不是一个try-catch唯一的东西块。

0

删除此:

Processor processor = null; 
DataSink datasink = null; 

和替换这样的:

Processor processor; 
DataSink datasink; 
+0

这会有帮助吗?无论如何,字段默认初始化为“空”。 – AbdullahC 2013-10-13 16:01:07

0

这是因为createRealizedProcessor是无法VedioCapture设备上工作。 问题是与Microsoft WDM图像设备。

相关问题