I want to extract more than one Metric from Reporting API V4 Java classes. I pass from "main" function the "ga:" names of dimensions and metrics to the function below:
private static ReportRequest createComplexRequest(java.lang.String startDate,java.lang.String endDate,ArrayList<java.lang.String> metrics,ArrayList<java.lang.String> dimensions, String pageToken){
DateRange dateRange = new DateRange();
dateRange.setStartDate(startDate);
dateRange.setEndDate(endDate);
//Create the Metric object ArrayList
int metricsSize=metrics.size();
Metric[] metricsArray = new Metric[metricsSize];
for(int i=0;i<metricsSize;i++){
    Metric metric = new Metric()
    .setExpression("ga:"+metrics.get(i))
    .setAlias(metrics.get(i));     
    metricsArray[i]=metric;
}
int dimensionsSize=dimensions.size();
Dimension[] dimensionsArray = new Dimension[dimensionsSize];   
for(int i=0;i<dimensionsSize;i++){
    Dimension dimension = new Dimension()
    .setName("ga:"+dimensions.get(i));     
    dimensionsArray[i]=dimension;
}    
ReportRequest request = new ReportRequest()
    .setViewId(VIEW_ID)
    .setDateRanges(Arrays.asList(dateRange))
    .setDimensions(Arrays.asList(dimensionsArray))        
    .setMetrics(Arrays.asList(metricsArray))
    .setPageToken(pageToken)
    .setPageSize(10000);
    return request;    
}
As an example, I'm trying to extract "sessions" and "bounces" metrics. While I was trying to troubleshoot this case I realized that the metricHeaders.size() is 2 (as many as my metrics) but row.getMetrics() returns only one ("session" metric). Below is what I mean. I intentionally created the following problematic print function which reveals the problem:
private static void printResponse(GetReportsResponse response) {
for (Report report: response.getReports()) {
  ColumnHeader header = report.getColumnHeader();
  List<String> dimensionHeaders = header.getDimensions();
  List<MetricHeaderEntry> metricHeaders = header.getMetricHeader().getMetricHeaderEntries();
  List<ReportRow> rows = report.getData().getRows();
  if (rows == null) {
     System.out.println("No data found for " + VIEW_ID);
     return;
  }
  for (ReportRow row: rows) {
    List<String> dimensions = row.getDimensions();
    List<DateRangeValues> metrics = row.getMetrics();
    System.out.println("Metrics size:"+metrics.size());
    for (int i = 0; i < dimensionHeaders.size() && i < dimensions.size(); i++) {
      System.out.println(dimensionHeaders.get(i) + ": " + dimensions.get(i));
    }  
    for(int l = 0;l<metricHeaders.size();l++)
    {            
       System.out.println(metricHeaders.get(l).getName());
       DateRangeValues values = metrics.get(l); 
    }
   }
 }
}
The above function crushes because metricHeaders.size() is 2 but metrics is List with only one metric, the "sessions" metric!! That's why I get:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
Do you have any idea why this happens??? Please help!!