Problema - java.lang.NullPointerException

[code]package tp01.organização;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random;

public class TP01Organização {

public class Livro{
    int nota;
    int nLeituras;
    String Nome;
}


public static void main(String[] args) throws FileNotFoundException, IOException{
    TP01Organização p = new TP01Organização();
    
}

public TP01Organização() throws FileNotFoundException, IOException{
    /*Opcode das instruções:
-1: imprime todo o conteúdo da memória de Livros!!!!(Livros)
0: imprime conteúdo do MAR(simula busca de livro)
1: Melhor nota
2: Numero de vezes que foi lido
    3: Termina
    */
    String[] memoriaInst;
    Livro[] memoriaDados = new Livro[100];
    int PC=0;
    int IR = -1; //opcode 
    int MAR1 = -1; //endereco
    int MAR2 = -1; //endereco
    String MBR = "";
    Livro MQ1 = new Livro();
    Livro MQ2 = new Livro();
    
    memoriaDados = gerarMemoriaDados();
    memoriaInst = gerarMemoriaInst();

    //começa o programa
    while (IR!=4){
            MBR = memoriaInst[PC];

            String[] aux = MBR.split(":");

            IR = Integer.parseInt(aux[0]);
            MAR1 = Integer.parseInt(aux[1]);
            MAR2 = Integer.parseInt(aux[2]);

            switch (IR){
                    case -1: {
                            System.err.println("Livros Disponiveis");
                            for(Livro Livro: memoriaDados)
                                    System.err.println(Livro.Nome);
                            break;
                    }
                    case 0: {
                            System.err.println(memoriaDados[MAR1]);
                            System.err.println(memoriaDados[MAR2]);
                            break;
                    }
                    case 1: {
                            MQ1 = memoriaDados[MAR1];
                            MQ2 = memoriaDados[MAR2];
                            if(MQ1.nota > MQ2.nota ){
                                System.err.println("Maior nota:" + MQ1.Nome);
                            }else System.err.println("Maior nota:" + MQ2.Nome);
                            break;
                    }
                    case 2: {
                            MQ1 = memoriaDados[MAR1];
                            MQ2 = memoriaDados[MAR2];
                            if(MQ1.nLeituras > MQ2.nLeituras ){
                                System.err.println("Lido mais vezes :" + MQ1.Nome);
                            }else System.err.println("Lido mais vezes :" + MQ2.Nome);
                            break;
                    }
            }

            PC++;
    }
}

private String[] gerarMemoriaInst(){
    
    String[] memoria = {"1:6:5", "2:7:6", "2:13:4", "3:6:3", "1:6:1", "2:18:5", "2:0:8", "3:6:32", "1:8:52", "2:22:52", "3:15:22", "0:6:12", "0:15:34", "-1:-1:-2", "4:-1:-2"};
    return memoria;
}

private Livro[] gerarMemoriaDados() throws FileNotFoundException, IOException{
    Livro[] memoria = new Livro[100];
    Random gerador = new Random();
    File arquivo = new File("/home/gustavo/arquivo.txt");
    FileReader fr = new FileReader(arquivo);
    BufferedReader br = new BufferedReader(fr);
    
    for(int i = 0 ; i < 100 ; i++ ){
        memoria[i].nota = gerador.nextInt(10);
        memoria[i].nLeituras = gerador.nextInt(100);
        String linha = br.readLine();
        memoria[i].Nome = linha;   
    }
    br.close();  
    fr.close();
    
    return memoria;
}

}[/code][code]

ERRO:
Exception in thread “main” java.lang.NullPointerException
at tp01.organização.TP01Organização.gerarMemoriaDados(TP01Organização.java:110)
at tp01.organização.TP01Organização.(TP01Organização.java:41)
at tp01.organização.TP01Organização.main(TP01Organização.java:19)
Java Result: 1

Me ajudem por favor!!!

Coloca esse código dentro da tag de código para visualizarmos melhor cara :slight_smile: