You are passing an empty array to the method, so reading throws an NPE because there is no buffer to read to.
But it seems you are doing it wrong, the FileChannel.read(ByteBuffer[],int,int) method is supposed to perform a "scattering read", in which data from the file channel is read sequentially to a series of buffers, e.g. to read the header and the body from a file to different buffers:
ByteBuffer header = ByteBuffer.allocate( headerLength );
ButeBuffer body = ByteBuffer.allocate( bodyLength );
FileChannel ch = FileChannel.open( somePath );
ch.read( new ByteBuffer[]{ header, body }, dataOffset, headerLength + bodyLength );
Will populate header with the first headerLength bytes, and body with the following bodyLength bytes.
If you just want to read bytes from a file into a buffer (which seems to be what what OP wanted), you should use the FileChannel.read(ByteBuffer,long) method, which will read as many bytes as there are remaining bytes in the given buffer:
ByteBuffer bb = ByteBuffer.allocate( bytesToRead );
FileChannel ch = FileChannel.open( somePath );
ch.read( bb, dataOffset );