Erro ao ordenar arquivo

Sou iniciante em Java e tenho o seguinte código:

import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException;

public class Principal{
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new FileReader(args[0]));
        try {
            ListaPais lp = new ListaPais();
            ListaJogador lj = new ListaJogador();
            String s, vs[];
            while((s = in.readLine()) != null) {
                vs = s.split("/");
                lp.insere(vs[2], vs[1], Integer.parseInt(vs[3]),
                        Float.parseFloat(vs[4]));
                lj.insere(vs[5], vs[1], Integer.parseInt(vs[3]),
                        Float.parseFloat(vs[4]));
            }
            in.close();
            System.out.println(lp);
            System.out.println("Depois da ordenacao pelo Item C:");
            Ordena_Item_C(lp);
            System.out.println(lp);
            System.out.println(lj);
            System.out.println("Depois da ordenacao pelo Item A:");
            Ordena_Item_A(lj);
            System.out.println(lj);
            System.out.println("Depois da ordenacao pelo Item B:");
            Ordena_Item_B(lj);
            System.out.println(lj);
            System.out.println("Depois da ordenacao pelo Item D:");
            Ordena_Item_D(lj);
            System.out.println(lj);
        }
        catch (Exception e){
            System.out.println("Excecao\n");
        }
    }
    public static void Ordena_Item_C(ListaPais lp){
        Pais p, q, maior;
        for(p = lp.prim; p != null; p = p.prox){
            maior = p;
            for(q = p.prox; q != null; q = q.prox){
                if(maior.num_total < q.num_total)
                    maior = q;
                else if((maior.num_total == q.num_total) && (maior.total_ptos <
                        q.total_ptos))
                    maior = q;
                else if ((maior.num_total == q.num_total) && (maior.total_ptos
                        == q.total_ptos) && (maior.total_premio < q.total_premio))
                    maior = q;
            }
            if(maior != p){
                String n = p.nome_pais;
                p.nome_pais = maior.nome_pais;
                maior.nome_pais = n;
                int aux = p.num_total;
                p.num_total = maior.num_total;
                maior.num_total = aux;
                aux = p.total_ptos;
                p.total_ptos = maior.total_ptos;
                maior.total_ptos = aux;
                float pr = p.total_premio;
                p.total_premio = maior.total_premio;
                maior.total_premio = pr;
                Torneio t = p.prim;
                p.prim = maior.prim;
                maior.prim = t;
            }
        }
    }
    public static void Ordena_Item_A(ListaJogador lj){
        Jogador p, q, maior;
        for(p = lj.prim; p != null; p = p.prox){
            maior = p;
            for(q = p.prox; q != null; q = q.prox){
                if(maior.num_vit_jog < q.num_vit_jog)
                    maior = q;
                else if((maior.num_vit_jog == q.num_vit_jog) &&
                        (maior.pontos_jog < q.pontos_jog))
                    maior = q;
                else if ((maior.num_vit_jog == q.num_vit_jog) &&
                        (maior.pontos_jog == q.pontos_jog) && (maior.premio_jog < q.premio_jog))
                    maior = q;
            }
            if(maior != p){
                String n = p.nome_jog;
                p.nome_jog = maior.nome_jog;
                maior.nome_jog = n;
                int aux = p.num_vit_jog;
                p.num_vit_jog = maior.num_vit_jog;
                maior.num_vit_jog = aux;
                aux = p.pontos_jog;
                p.pontos_jog = maior.pontos_jog;
                maior.pontos_jog = aux;
                float pr = p.premio_jog;
                p.premio_jog = maior.premio_jog;
                maior.premio_jog = pr;
                Torneio t = p.prim;
                p.prim = maior.prim;
                maior.prim = t;
            }
        }
    }
    public static void Ordena_Item_B(ListaJogador lj){
        Jogador p, q, maior;
        for(p = lj.prim; p != null; p = p.prox){
            maior = p;
            for(q = p.prox; q != null; q = q.prox){
                if(maior.pontos_jog < q.pontos_jog)
                    maior = q;
                else if((maior.pontos_jog == q.pontos_jog) &&
                        (maior.num_vit_jog < q.num_vit_jog))
                    maior = q;
                else if ((maior.pontos_jog == q.pontos_jog) &&
                        (maior.num_vit_jog == q.num_vit_jog) && (maior.premio_jog <
                        q.premio_jog))
                    maior = q;
            }
            if(maior != p){
                String n = p.nome_jog;
                p.nome_jog = maior.nome_jog;
                maior.nome_jog = n;
                int aux = p.num_vit_jog;
                p.num_vit_jog = maior.num_vit_jog;
                maior.num_vit_jog = aux;
                aux = p.pontos_jog;
                p.pontos_jog = maior.pontos_jog;
                maior.pontos_jog = aux;
                float pr = p.premio_jog;
                p.premio_jog = maior.premio_jog;
                maior.premio_jog = pr;
                Torneio t = p.prim;
                p.prim = maior.prim;
                maior.prim = t;
            }
        }
    }
    public static void Ordena_Item_D(ListaJogador lj){
        Jogador p, q, maior;
        for(p = lj.prim; p != null; p = p.prox){
            maior = p;
            for(q = p.prox; q != null; q = q.prox){
                if(maior.premio_jog < q.premio_jog)
                    maior = q;
                else if((maior.premio_jog == q.premio_jog) && (maior.pontos_jog
                        < q.pontos_jog))
                    maior = q;
                else if ((maior.premio_jog == q.premio_jog) &&
                        (maior.pontos_jog == q.pontos_jog) && (maior.num_vit_jog <
                        q.num_vit_jog))
                    maior = q;
            }
            if(maior != p){
                String n = p.nome_jog;
                p.nome_jog = maior.nome_jog;
                maior.nome_jog = n;
                int aux = p.num_vit_jog;
                p.num_vit_jog = maior.num_vit_jog;
                maior.num_vit_jog = aux;
                aux = p.pontos_jog;
                p.pontos_jog = maior.pontos_jog;
                maior.pontos_jog = aux;
                float pr = p.premio_jog;
                p.premio_jog = maior.premio_jog;
                maior.premio_jog = pr;
                Torneio t = p.prim;
                p.prim = maior.prim;
                maior.prim = t;
            }
        }
    } }


class ListaPais{
        Pais prim;
        ListaPais(){
        prim = null;
        }
        Pais pertence(String n){
        Pais p = prim;
        while((p != null) && (!n.equals(p.nome_pais))) p = p.prox;
        return p;
        }
        void insere(String np, String n, int ptos, float p){
        Pais q = pertence(np);
        if(q == null){
        q = new Pais(np);
        q.prox = prim;
        prim = q;
        }
        q.insere_torneio (n, ptos, p);
        }
public String toString(){
        Pais p = prim;
        String resp = "";
        while(p != null){
        resp += p.toString();
        resp += "\n";
        p = p.prox;
        }
        return resp;
        }
        }



class Pais{
    String nome_pais;
    int num_total, total_ptos;
    float total_premio;
    Torneio prim;
    Pais prox;
    Pais(String np){
        nome_pais = np;
        num_total = total_ptos = 0;
        total_premio = 0.0F;
        prim = null;
        prox = null;
    }
    void insere_torneio(String n, int ptos, float p){
        num_total++;
        total_ptos += ptos;
        total_premio += p;
        Torneio q = new Torneio(n, ptos, p);
        q.prox = prim;
        prim = q;
    }
    public String toString(){
        String resp = nome_pais + " " + num_total + " " + total_ptos + " "
                + total_premio + ":\n";
        Torneio p = prim;
        while(p != null){
            resp += p.toString();
            p = p.prox;
        }
        return resp;
    }
}



class ListaJogador{
    Jogador prim;
    ListaJogador(){
        prim = null;
    }
    Jogador pertence(String n){
        Jogador p = prim;
        while((p != null) && (!n.equals(p.nome_jog))) p = p.prox;
        return p;
    }
    void insere(String nj, String n, int ptos, float p){
        Jogador q = pertence(nj);
        if(q == null){
            q = new Jogador(nj);
            q.prox = prim;
            prim = q;
        }
        q.insere_torneio (n, ptos, p);
    }
    public String toString(){
        Jogador p = prim;
        String resp = "";
        while(p != null){
            resp += p.toString();
            resp += "\n";
            p = p.prox;
        }
        return resp;
    }
}



class Jogador{
    String nome_jog;
    int num_vit_jog, pontos_jog;
    float premio_jog;
    Torneio prim;
    Jogador prox;
    Jogador(String n){
        nome_jog = n;
        num_vit_jog = pontos_jog = 0;
        premio_jog = 0.0F;
        prim = null;
        prox = null;
    }
    void insere_torneio(String n, int ptos, float p){
        num_vit_jog++;
        pontos_jog += ptos;
        premio_jog += p;
        Torneio q = new Torneio(n, ptos, p);
        q.prox = prim;
        prim = q;
    }
    public String toString(){
        String resp = nome_jog + " " + num_vit_jog + " " + pontos_jog + " "
                + premio_jog + ":\n";
        Torneio p = prim;
        while(p != null){
            resp += p.toString();
            p = p.prox;
        }
        return resp;
    }
}



class Torneio{
    String nome;
    int pontos;
    float premio;
    Torneio prox;
    Torneio(String n, int ptos, float p){
        pontos = ptos;
        premio = p;
        nome = n;
        prox = null;
    }
    public String toString(){
        return nome + "\n";
    }
}



Preciso fazer essas ordenações e exibir o resultado correto para um arquivo com conteúdo assim:

02.01.12/Brisbane/Australia/250/434250.0/Andy Murray
02.01.12/Chennai/India/250/398250.0/Milos Raonic
02.01.12/Doha/Qatar/250/1024000.0/Jo Wilfried Tsonga
09.01.12/Heineken Open/New Zealand/250/398250.0/David Ferrer
09.01.12/Apia Int. Sydney/Australia/250/434250.0/Jarkko Nieminen
16.01.12/Australian Open/Australia/2000/11806550.0/Novak Djokovic
30.01.12/Open Sud de France/France/250/398250.0/Tomas Berdych
13.02.12/ABN AMRO World/The Netherlands/500/1207500.0/Roger Federer
13.02.12/SAP Open/U.S.A./250/531000.0/Milos Raonic
13.02.12/Brasil Open 2012/Brazil/250/475300.0/Nicolas Almagro
20.02.12/Copa Claro/Argentina/250/484100.0/David Ferrer
20.02.12/Open 13/France/250/512750.0/Juan Martin Del Potro
20.02.12/Regions Morgan Keegan Champ/U.S.A./500/1155000.0/Jurgen Melzer
27.02.12/Abierto Mexicano Telcel/Mexico/500/1155000.0/David Ferrer
27.02.12/Delray Beach Int Tennis Cham/U.S.A./250/442500.0/Kevin Anderson
27.02.12/Dubai Duty Free Tennis Champ/U.A.E./500/1700475.0/Roger Federer
08.03.12/BNP Paribas Open/U.S.A./1000/4694969.0/Roger Federer
21.03.12/Sony Ericsson Open/U.S.A./1000/3973050.0/Novak Djokovic

Mas estou tomando o seguinte erro:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Principal.main(Principal.java:7)

Poderiam me ajudar?