2010-01-26 8 views
-3

Voici le code:erreur java: Exception dans le thread "principal" 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."); 
     } 
} 

Erreur:

run:

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)

s'il vous plaît me aider avec cette erreur. J'utilise Windows Vista OS.

quelqu'un peut-il me suggérer comment stocker des fichiers au format .3gp s'il vous plaît aider

+1

Vous * vraiment * besoin de condenser, de simplifier et de clarifier cela. –

+0

C'est un compatriote Rhode Islander! Salut. –

+4

Appelez-moi fou, mais je suppose que quelque chose sur la ligne 202 est une null .... – BlairHippo

Répondre

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

Certains référence d'objet à la ligne 202 de jmfcam05v.java, dans la méthode startCapture(), est null alors que le code tente d'accéder/Invoke à l'aide du point opérateur ..

E.g.

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

La solution est réellement facile. Assurez-vous que ce n'est pas nulle soit instancier:

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

... ou simplement en faisant un nullcheck avant d'accéder à/invocation:

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

même programme de travail ws bien avec win xp – Ishan

+1

Alors? Ce fait ne résout toujours pas le problème :) Vérifiez simplement la ligne (ou au moins pointez-nous la ligne, ou -better- poster un SSCCE: http://sscce.org). Les informations que vous nous avez fournies jusqu'ici ne contiennent pratiquement rien à travailler.J'ai seulement donné une réponse générique à la façon de réparer un NPE afin que vous puissiez le clouer plus bas vous-même. – BalusC

0

Il semble que cette ligne:

processor = Manager.createRealizedProcessor(pm); 

jette un CannotRealizeException, ce qui processor nul et conduisant à la NPE plus tard. Quant à ce que cette exception est levée, cela semble avoir à voir avec vos données et votre utilisation du JMF.

Généralement, il est mauvais d'utiliser System.out.println() sur les exceptions car vous perdez alors la trace de la pile, qui est souvent l'information la plus importante pour le débogage. Au lieu. utiliser exception.printStackTrace();

+0

même programme fonctionne bien ws avec win xp – Ishan

1

Le NPE est facile. L'une des lignes

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

de méthode startCapture jette un CannotRealizeException. Donc datasink n'est pas initialisé et si vous essayez de le fermer plus tard dans stopCapture, c'est toujours null et cela provoque le NPE.

Pour éviter le test NPE: si datasink n'est pas null avant d'appeler une méthode.

EDIT

et pourrait vous retirer la S'IL VOUS PLAÎT logique de l'application du constructeur et le déplacer vers la principale méthode. Un constructeur est pour construire un objet, principalement pour initialiser les membres de la classe et rien d'autre. Et les classes Java devraient commencer par une lettre majuscule, qui aide les gens (et nous) à comprendre le code.

1

Une mauvaise gestion des exceptions est à blâmer ici.

Très probablement, le membre processor ne reçoit pas initialisé. S'il n'y a pas de processeur, il semble que vous ne puissiez rien faire d'utile. Alors laissez l'exception voler, mettant fin à votre programme condamné à ce moment-là, au lieu de "l'avaler" et continuer allègrement.

Aussi, si vous allez manger des exceptions et soldat, au moins les imprimer correctement: ex.printStackTrace(), au lieu de System.out.println(ex).

Mais il vaudrait beaucoup mieux ajouter des clauses throws à vos méthodes, et ne pas intercepter d'exceptions, puisque vous ne pouvez pas les récupérer. Peut-être que le codec Indeo était présent sur votre boîte de Windows XP, mais n'est pas disponible sur votre machine Vista. (Mise à jour: En fait, Indeo est pas pris en charge et not compatible with Vista.) qui empêche l'processor d'être créé avec succès, et votre programme est voué à ce point. Existe-t-il un moyen de tester si un FileTypeDescriptor ou VideoFormat est valide lors de l'exécution?

0

datasink est jamais en cours d'initialisation.

Lorsque vous essayez d'appeler

datasink.close(); 

Son dire que datasink est nulle.

Assurez-vous que votre code devient réellement et ligne de traitement # 176

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

En regardant la méthode private void startCapture() Je suppose que la variable processor est NULL que c'est la seule substance qui ne sont pas dans un try-catch bloc.

0

Supprimer ceci:

Processor processor = null; 
DataSink datasink = null; 

et le remplacer par ceci:

Processor processor; 
DataSink datasink; 
+0

Comment cela aiderait-il? Les champs sont initialisés à 'null' par défaut de toute façon. – AbdullahC

0

Ceci est dû à createRealizedProcessor ne peut pas travailler sur l'appareil VedioCapture. Problème avec le périphérique d'image Microsoft WDM.

Questions connexes