Jogo Vinte Um

Bom dia a todos!
Hoje tenho um programa de exemplos de um jogo de vinte um.
Ao executá-lo me deparo com a seguinte mensagem de erro:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 52
at cartas.Baralho.proximaCarta(Baralho.java:36)
at cartas.VinteUm.main(VinteUm.java:28)

package cartas;

public class Carta {
	public static final int PAUS=1, OUROS=2, ESPADAS=3, COPAS=4;
	
	private int naipe;
	private int valor;
	
	public Carta(int n, int v){
		naipe = n &gt= PAUS && n &lt= COPAS ? n : 1;
		valor = v &gt= 1 && n &lt= 13 ? v : 1;
	}
	
	public int getNaipe(){
		return naipe;
	}
	
	public int getValor(){
		return valor;
	}
	
	public String toString(){
		String tmp = null;
		switch(valor){
		case 1: tmp = "as"; break;
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 7:
		case 8:
		case 9:
		case 10: tmp = valor +""; break;
		case 11: tmp = "valete"; break;
		case 12: tmp = "dama"; break;
		case 13: tmp = "rei"; break;			
		}
		switch(naipe){
		case PAUS: return tmp + " de paus";
		case OUROS: return tmp + " de ouros";
		case ESPADAS: return tmp + " de espadas";
		case COPAS: return tmp + " de copas";
		}
		return tmp;
	}
}
package cartas;

public class Baralho {
	private Carta monte[];
	private int topo;
	
	public Baralho(){
		monte = new Carta[52];
		topo = 0;
		for(int n = 1; n &lt 5; n++){
			for(int v = 1; v &lt 14; v++){
				monte[topo++] = new Carta(n, v);
			}
		}
	}
	
	public boolean temCarta(){
		return topo &gt 0;
	}
	
	public Carta proximaCarta(){
		Carta tmp = null;
		if(topo &gt 0)
			tmp = monte[topo--];
		return tmp;
	}
	
	public void embaralhar(){
		for(int c = 0; c &lt 52; c++){
			int i = (int)Math.round(Math.random()*51);
			Carta tmp = monte[i];
			monte[i] = monte[c];
			monte[c] = tmp;
		}
	}
}
package cartas;

public class VinteUm {
	public static void main(String[] args) {
		int jogador = 0, pontosJogador = 0;
		int comput = 0, pontosComput = 0;
		
		Carta cartasJogador[] = new Carta[19];
		Carta cartasComput[] = new Carta[19];
		
		Baralho b = new Baralho();
		b.embaralhar();
		String resp = "N";
		do{
			cartasJogador[jogador++] = b.proximaCarta();
			System.out.println("\n Suas cartas: ");
			mostraCartas(cartasJogador);
			pontosJogador = somaCartas(cartasJogador);
			if(pontosJogador &lt 21){
				System.out.println("Quer carta? (S|N");
				resp = Input.readString();
			}
		}while(resp.equals("S") && pontosJogador &lt 21);
		if(pontosJogador &gt 21){
			System.out.println("Você perdeu!");
			return;
		}
		System.out.println("\n Minhas cartas:");
		while(pontosComput &lt pontosJogador && pontosComput != 21){
			cartasComput[comput++] = b.proximaCarta();
			pontosComput = somaCartas(cartasComput);
		}
		mostraCartas(cartasComput);
		if(pontosComput &gt= pontosJogador && pontosComput != 21){
			System.out.println("\n Você perdeu!");
		}else{
			System.out.println("\n Você ganhou!");
		}
	}
	
	private static int somaCartas(Carta mao[]){
		int i = 0,  pontos = 0;
		while(mao[i] != null){
			if(mao[i].getValor() &gt 10)
				pontos++;
			else
				pontos += mao[i].getValor();
			i++;
		}
		return pontos;
	}
	
	private static void mostraCartas(Carta mao[]){
		int i = 0;
		while(mao[i] != null){
			System.out.println((i != 0 ? " , "  : " ")+ mao[i].toString());
			i++;
		}
		System.out.println("\n Pontos = " + somaCartas(mao));
	}
}

Não consigo ver como acertar este programa. Por favor me ajudem!!!

Veja o erro:

java.lang.ArrayIndexOutOfBoundsException:

Vc esta acessando uma posição do Array que nao existe , faça um debug do seu codigo ;;

Como eu vejo isto?

Em que parte do código?

Você colocou topo-- onde deveria ter colocado --topo

public Carta proximaCarta(){
	Carta tmp = null;
	if(topo > 0)
		tmp = monte[[b]--topo[/b]];
	return tmp;
}

Ok, vou tentar

Ok, realmente foi muito bom, deu corretamente ´certo.
Muito obrigado à vocês.