Salve a tutti, 
sto cercando di implementare un metodo che mi calcola la distanza euclidea tra i valori di una Map
.Compila bene ma mi da un NullPointerException e non capisco dove sta il problema. Qualcuno mi può dare un suggerimento? 
ecco il codice:
import java.util.*;
public class MRdati {
	
            public double D(String u1, String u2, Map <String,Map<String, Double>> critics){
		
        Map <String, Double> u1c = critics.get(u1);
		Map<String, Double> u2c = critics.get(u2);
		double d=0;
	
		
		for (String film: u1c.keySet()){
			double v1 = u1c.get(film); // per ogni stringa film trova il suo valore
			double v2 = u2c.get(film);
				if(v2 == 0)
				continue;
			d+=(v2-v1)*(v2-v1);
		}
	
		return Math.sqrt(d);
	}
	public double[] ListaR( Map <String,Map<String, Double>> critics, String w1){
		double []d1= new double [critics.size()-1];
		int i=0;
		 for (String critics_i: critics.keySet()){
			d1=D(w1, critics_i, critics);
			i++;
		}
	return d1;
	}
	
	public double [][] listaRlistaR(Map <String,Map<String, Double>>critics){
		int i=0;
		double [][]d2 = new double[critics.size()][critics.size()-1];
	for(String s : critics.keySet()){
		d2 = ListaR(critics, s);
		i++;
	}
	return d2;
	}
	
	public static void main (String[]args){
	
		Map <String , Double> ratesLR = new HashMap<String , Double >();
	  ratesLR.put("Lady in the water", 2.5);
	  ratesLR.put("Snakes on a plane", 3.5);
	  ratesLR.put("Just my luck", 3.0);
	  ratesLR.put("Superman returns", 3.5);
	  ratesLR.put("The night Listener", 3.0);
	  ratesLR.put("You me and Dupree", 2.5);
	  
    
	  
	  Map <String , Double> ratesGS = new HashMap <String , Double >();
	  
	  ratesGS.put("Lady in the water", 3.0);
	  ratesGS.put("Snakes on a plane", 3.5);
	  ratesGS.put("Just my luck",      1.5);
	  ratesGS.put("Superman returns",  5.0);
	  ratesGS.put("The night Listener", 3.0);
	  ratesGS.put("You me and Dupree", 3.5);
	  
	  Map <String , Double> ratesMP = new HashMap <String , Double >();
	  
	  ratesMP.put("Lady in the water",   2.5);
	  ratesMP.put("Snakes on a plane",   3.5);
	  ratesMP.put("Just my luck",      1.5);
	  ratesMP.put("Superman returns",    3.5);
	  ratesMP.put("The night Listener", 4.0);
	  ratesGS.put("You me and Dupree", 3.5);
	  
	  Map <String , Double> ratesCP = new HashMap <String , Double >();
	  
	  ratesCP.put("Lady in the water",   2.5);
	 ratesCP.put("Snakes on a plane",3.5 );
	  ratesCP.put("Just my luck ",3.0 );
	  ratesCP.put("Superman returns",  4.0);
	  ratesCP.put("The night Listener", 4.5);
	   ratesCP.put("You me and Dupree", 2.5);
	  
    Map <String , Double> ratesML = new HashMap <String , Double >();
	  
    ratesML.put("Lady in the water", 3.0 );
    ratesML.put("Snakes on a plane", 4.0 );
	  ratesML.put("Just my luck ",      3.0 );
	  ratesML.put("Superman returns",  3.0);
	  ratesML.put("The night Listener", 3.0);
	  ratesML.put("You me and Dupree", 2.0);
	  
    Map <String , Double> ratesJM = new HashMap <String , Double >();
	  
    ratesJM.put("Lady in the water", 3.0 );
    ratesJM.put("Snakes on a plane", 4.0 );
    ratesJM.put("Just my luck ",      3.0 );
    ratesJM.put("Superman returns",  5.0);
    ratesJM.put("The night Listener", 3.0);
    ratesJM.put("You me and Dupree", 3.5);
	  
   
	  Map<String, Map<String, Double>> critics = new HashMap<String, Map<String, Double>> ();
	  
	  critics.put("Lisa Rose", ratesLR);
	  critics.put("Gene Seymour", ratesGS);
	  critics.put("Michael Phillips", ratesMP);
	  critics.put("Claudia Puig", ratesCP);
	  critics.put("Mick Lasale", ratesML);
	  critics.put("John Matthews", ratesJM);
	  
	  MRdati mrd = new MRdati();
      System.out.println("dist euclid" + mrd.D("Lisa Rose", "Gene Seymour", critics));
	
	
     MRdati mrd1 = new MRdati();
    System.out.println("risultato "+ mrd1.ListaR(critics, "Lisa Rose"));
      
      
	}
}