2010-10-28 39 views
2

我试图运行此代码,但出现错误。谁能告诉我为什么?调试器显示以下Android中的NegativeArraySizeException

螺纹[< 3>主](暂停(例外NegativeArraySizeException)) ViewRoot.handleMessage(消息)线:1704 的ViewRoot(处理程序).dispatchMessage(消息)线:99 Looper.loop ()行:123 ActivityThread.main(String [])line:4203 Method.invokeNative(Object,Object [],Class,Class [],Class,int,boolean)line:not available [本机方法] Method .invoke(Object,Object ...)line:521 ZygoteInit $ MethodAndArgsCaller.run()line:791 ZygoteInit.main(String [])line:549 NativeStart.main(String [])line:not available [本地方法]

public void convertAudio() throws IOException { 
    Log.d("FILE", "Converting Audio"); 
    java.io.File fileExist = new java.io.File("/sdcard/" , "test1.3gp"); 
    java.io.File fileNew = new java.io.File("/sdcard/" , "test2.3gp"); 
    if (fileNew.exists()) { 
    FileInputStream fExist = new FileInputStream(fileExist); 
     FileInputStream fNew = new FileInputStream(fileNew); 

     long lengthExist = fileExist.length(); 
     if (lengthExist > Integer.MAX_VALUE) { 
      // File is too large 
     } 
     byte[] bytesExist = new byte[(int)lengthExist]; 

     int offset = 0; 
     int numRead = 0; 
     try { 
     while (offset < bytesExist.length && (numRead=fExist.read(bytesExist, offset, bytesExist.length-offset)) >= 0) { 
      offset += numRead; 
     } 
     } finally { 


     } 

     // Ensure all the bytes have been read in 
     if (offset < bytesExist.length) { 
      throw new IOException("Could not completely read file "+fileExist.getName()); 
     } 


     byte[] cleanExist = convert3gpDataToAmr(bytesExist); 

     long lengthNew = fileNew.length(); 
     if (lengthNew > Integer.MAX_VALUE) { 
      // File is too large 
     } 
     byte[] bytesNew = new byte[(int)lengthNew]; 

     int offsetNew = 0; 
     int numReadNew = 0; 
     try { 
     while (offset < bytesNew.length && (numRead=fNew.read(bytesNew, offsetNew, bytesNew.length-offsetNew)) >= 0) { 
     offsetNew += numReadNew; 
     } 
     } finally { 


     } 

     // Ensure all the bytes have been read in 
     if (offset < bytesNew.length) { 
      throw new IOException("Could not completely read file "+fileExist.getName()); 
     } 


     byte[] cleanNew = convert3gpDataToAmr(bytesNew);  

    } 


    } 

//#!AMR \ n

private static byte[] AMR_MAGIC_HEADER = {0x23, 0x21, 0x41, 0x4d, 0x52, 0x0a}; 

    public byte[] convert3gpDataToAmr(byte[] data) { 
    if (data == null) { 
     return null; 
    } 

    ByteArrayInputStream bis = new ByteArrayInputStream(data); 
     // read FileTypeHeader 
    FileTypeBox ftypHeader = new FileTypeBox(bis); 
    // You can check if it is correct here 
    // read MediaDataHeader 
    MediaDataBox mdatHeader = new MediaDataBox(bis); 
    // You can check if it is correct here 
    int rawAmrDataLength = mdatHeader.getDataLength(); 
    int fullAmrDataLength = AMR_MAGIC_HEADER.length + rawAmrDataLength; 
    byte[] amrData = new byte[fullAmrDataLength]; 
    System.arraycopy(AMR_MAGIC_HEADER, 0, amrData, 0, AMR_MAGIC_HEADER.length); 
     bis.read(amrData, AMR_MAGIC_HEADER.length, rawAmrDataLength); 
    return amrData; 
} 


} 

回答

2

我会检查是否fullAmrDataLength是否定的,因为那时

byte[] amrData = new byte[fullAmrDataLength]; 

会导致NegativeArraySizeException

+0

@viperdudeuk:这有什么好运? – 2010-11-01 12:25:30

+0

谢谢,它对它进行了排序。 – 2010-11-01 12:35:44

+1

然后请接受答案。 – 2010-11-01 12:41:21