Programa maior numero - erros

Boa Noite Pessoal,
Alguém pode me ajudar?
Meu programa mostra o seguinte erro:
Erro!java.lang.NullPointerExceptionCONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 12 segundos)
Para mais esclarecimentos: quando escolho a opção 1. o programa é CONSTRUIDO COM SUCESSO.
quando escolho a opção 2. ele mostra esse erro.
Já fiz diversas modificações e não tive exito.
Esse abaixo o código:

import java.util.Scanner;
public class Main {

public static void main(String[] args) throws Exception {
    try {
        Scanner scannerInt = new Scanner(System.in);
        Scanner scannerStr = new Scanner(System.in);
        
        String caminhoArquivoClasse1 = ".\\files_classe1\\matrixclasse1.txt";
        String caminhoArquivoClasse2 = ".\\files_classe2\\matrixclasse2.txt";
        
        System.out.println ("Digite 1 para Classe1:");
        System.out.println ("Digite 2 para Classe2:");
        
      int opcao;
        opcao = scannerInt.nextInt();
      
      String nome1;
      String nome2;
      String nome3;
                  
        System.out.print("Digite o primeiro nome: ");
        nome1 = scannerStr.nextLine();
        System.out.print("Digite o segundo nome: ");
        nome2 = scannerStr.nextLine();
        System.out.print("Digite o terceiro nome: ");
        nome3 =scannerStr.nextLine();
        System.out.println();
        
        if (opcao == 1){
	Classe1.geraArquivos1(caminhoArquivoClasse1,nome1,nome2,nome3);	
        }else if (opcao == 2){
	Classe2.geraArquivos2(caminhoArquivoClasse2,nome1,nome2,nome3);	
        }else System.out.print("Erro");
        }catch (Exception ex){
	System.out.print("Erro!"+ex);
		}       
                                         
    }
}

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Classe1 {

private static String linhaAlterada;
private static String linhaStr;
private static String c1 = null, c2 = null, c3 = null, c4 = null;
private static String arqc1 = null, arqc2 = null, arqc3 = null, arqc4 = null;
private static int posAlt;

public static void geraArquivos1(String caminho, String  nome1, String  nome2, String  nome3) throws Exception {
    FileReader fr;
    fr = new FileReader(caminho);
    BufferedReader br = new BufferedReader(fr);

    try{
        for (int i = 0; i <= 2; i++) {
            for (int j = 0; j <= 2; j++) {
                for (int k = 0; k <= 2; k++) {
                    for (int l = 0; l <= 2; l++) {
                        switch (i) {
                            case 0:
                                c1 = nome1;
                                arqc1 = "1";
                                break;
                            case 1:
                                c1 = nome2;
                                arqc1 = "3";
                                break;
                            case 2:
                                c1 = nome3;
                                arqc1 = "6";
                                break;
                        }
                        switch (j) {
                            case 0:
                                c2 = nome1;
                                arqc2 = "1";
                                break;
                            case 1:
                                c2 = nome2;
                                arqc2 = "3";
                                break;
                            case 2:
                                c2 = nome3;
                                arqc2 = "6";
                                break;
                        }
                        switch (k) {
                            case 0:
                                c3 = nome1;
                                arqc3 = "1";
                                break;
                            case 1:
                                c3 = nome2;
                                arqc3 = "3";
                                break;
                            case 2:
                                c3 = nome3;
                                arqc3 = "6";
                                break;
                        }
                        switch (l) {
                            case 0:
                                c4 = nome1;
                                arqc4 = "1";
                                break;
                            case 1:
                                c4 = nome2;
                                arqc4 = "3";
                                break;
                            case 2:
                                c4 = nome3;
                                arqc4 = "6";
                                break;
                        }
                        File file = new File(".\\files_classe1\\"+arqc1+arqc2+arqc3+arqc4+".txt");
                        FileWriter fw = new FileWriter(file);
                        BufferedWriter bw = new BufferedWriter(fw);
                        file.createNewFile();
                            
                            linhaStr = br.readLine();
                            if (linhaStr == null) {
                                br.close();
                                fr.close();
                                fr = new FileReader(caminho);
                                br = new BufferedReader(fr);
                                linhaStr = br.readLine();
                            }
                            int alterou = 1;
                            while (linhaStr.indexOf("finalArq") == -1) {
                                posAlt = linhaStr.indexOf("altLQQ");
                                if (posAlt != -1) {
                                    switch (alterou) {
                                        case 1:
                                            linhaAlterada = linhaStr.replace("altLQQ", c1);
                                            alterou = 2;
                                            break;
                                        case 2:
                                            linhaAlterada = linhaStr.replace("altLQQ", c2);
                                            alterou = 3;
                                            break;
                                        case 3:
                                            linhaAlterada = linhaStr.replace("altLQQ", c3);
                                            alterou = 4;
                                            break;
                                        case 4:
                                            linhaAlterada = linhaStr.replace("altLQQ", c4);
                                            alterou = 1;
                                            break;
                                    }
                                    bw.write(linhaAlterada);
                                    bw.newLine();
                                    linhaStr = br.readLine();
                                } else {
                                    bw.write(linhaStr);
                                    bw.newLine();
                                    linhaStr = br.readLine();
                                }
                            }
                            bw.flush();
                            bw.close();
                        }
                    }
                }
            }
        } catch (FileNotFoundException e) {
        throw new FileNotFoundException("Arquivo nao encontrado: " + caminho);
    } catch (IOException e) {
        throw new IOException("Erro na leitura do arquivo", e);
    } finally {
        fr.close();
        br.close();
    }
}

}