Duvidas sobre alguns "erros"

Ola, bem fiz algumas classes de um baralho/carta e fiz um jogo de vinte um colocado em um livro de java, bem tudo compilou direitinho mas ao tentar rodar o programa essa msg aparece na tela:

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException
at Baralho.proximaCarta(Baralho.java:20)
at Vinteum.main(Vinteum.java:13)
Valew!

// Baralho.java 

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


// Vinteum.java

public class Vinteum{
  public static void main(String args[]){
    int jogador=0,pontosJogador=0, //Definicao das variaveis do jogador e do croupier
    comput=0, pontosComput=0;
    Carta cartasJogador[]=new Carta[19],
          cartasComput[]= new Carta[19];
    Baralho b=new Baralho();
    b.embaralhar();
    String resp="N";
    do{
     cartasJogador[jogador++]=b.proximaCarta();
     System.out.println("
Suas cartas:");
     mostraCartas(cartasJogador);
     pontosJogador=somaCartas(cartasJogador);
     if(pontosJogador<21){
      System.out.println("Quer carta? (S|N)");
      resp=Input.readString();
     }
    }while(resp.equals("S")&&pontosJogador<21);
    if(pontosJogador>21){
     System.out.println("Voce perdeu!!");
     return;
    }
    System.out.println("
Minhas cartas:");
    while(pontosComput<pontosJogador&&pontosComput!=21){
     cartasComput[comput++]=b.proximaCarta();
     pontosComput=somaCartas(cartasComput);
    }
    mostraCartas(cartasComput);
    if(pontosComput>=pontosJogador&&pontosComput<=21){
     System.out.println("
Voce perdeu!");
    } else{
       System.out.println("
Voce ganhou!!");
      }

seu codigo ta meio incompleto…
mas se voce substituir o metodo abaixo na sua classe Baralho… acho que deve funcionar

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

obrigado agora so falta saber como ganhar