Matriz

Olá, boa tarde, estou com problema no seguinte código:

public static void main(String[] args) {
    NumberFormat nf = NumberFormat.getCurrencyInstance();
    int numero = 0;
    while (numero <= 0) {
        String str = "Informe o números de funcionarios";
        str = JOptionPane.showInputDialog(null, str);
        if (str == null) {
            System.exit(0);
        }
        numero = Integer.parseInt(str);

    }
    String str = "";
    String funcionarios[] = new String[numero];
    for (int i = 1; i <= numero; i++) {
        while (true) {
            str = "Imforme o nome do funcionário número: " + i;
            str = JOptionPane.showInputDialog(null, str);
            if (str == null) {
                if (str == null) break;
            }
            if (str.length() >= 3 && str.length() <= 50) {
                str = str.trim();
                funcionarios[i - 1] = str;
                break;
            }          
                      
        }if (str == null) break;
    }
    double dadosFuncionarios[][] = new double[numero][4];
    for (int l = 0; l < dadosFuncionarios.length; l++) {
        while (true) {
            str = "Informe o salario bruto do funcionario " + funcionarios[l];
            str = JOptionPane.showInputDialog(null, str);
            if (str == null) {
                System.exit(0);
            }
            double salarioBruto = Double.parseDouble(str);
            if (salarioBruto < 465) {
                JOptionPane.showMessageDialog(null, "Salario inválido");
            } else {
                dadosFuncionarios[l][0] = salarioBruto;
                break;
            }
            break;
        }
        while (true) {
            if (dadosFuncionarios[l][0] <= 965.67) {
                dadosFuncionarios[l][1] = (dadosFuncionarios[l][0] / 100) * 8;
                break;
            }
            if (dadosFuncionarios[l][0] >= 965.68 && dadosFuncionarios[l][0] <= 1609.45) {
                dadosFuncionarios[l][1] = (dadosFuncionarios[l][0] / 100) * 9;
                break;

            }
            if (dadosFuncionarios[l][0] >= 1609.46 && dadosFuncionarios[l][0] <= 3218.90) {
                dadosFuncionarios[l][1] = (dadosFuncionarios[l][0] / 100) * 11;
                break;

            }
            if (dadosFuncionarios[1][0] >= 3218.91) {
                dadosFuncionarios[l][1] = 354.47;
                break;
            }
            break;
        }
        while (true) {
            if (dadosFuncionarios[l][0] < 1434) {
                dadosFuncionarios[l][2] = (dadosFuncionarios[l][0] / 100) * 0;
                break;
            }

            if (dadosFuncionarios[l][0] >= 1434.01 && dadosFuncionarios[l][0] <= 2150) {
                dadosFuncionarios[l][2] = (dadosFuncionarios[l][0] / 100) * 7.5;
                break;
            }
            if (dadosFuncionarios[l][0] >= 2150.01 && dadosFuncionarios[l][0] <= 2886) {
                dadosFuncionarios[l][2] = (dadosFuncionarios[l][0] / 100) * 15;
                break;
            }
            if (dadosFuncionarios[l][0] >= 2886.01 && dadosFuncionarios[l][0] < 3582) {
                dadosFuncionarios[l][2] = (dadosFuncionarios[l][0] / 100) * 22.5;
                break;
            }
            if (dadosFuncionarios[l][0] >= 3582.01) {
                dadosFuncionarios[l][2] = (dadosFuncionarios[l][0] / 100) * 27.5;
                break;
            }
            break;
        }

        while (true) {
            dadosFuncionarios[l][3] = (dadosFuncionarios[l][1] + dadosFuncionarios[l][2]) - dadosFuncionarios[l][0];
            break;

        }

    }
    double salarioBrutoTotal = 0;
    double inssTotal = 0;
    double impostoDeRendaTotal = 0;
    double salarioLiquidoTotal = 0;

    str = "Resultado da folha de pagamento.\n\n\n";
    for (int l = 0; l < dadosFuncionarios.length; l++) {

        salarioBrutoTotal += dadosFuncionarios[l][0];
        inssTotal += dadosFuncionarios[l][1];
        impostoDeRendaTotal += dadosFuncionarios[l][2];
        salarioLiquidoTotal += dadosFuncionarios[l][3];

        str += funcionarios[l] + " - " + nf.format(dadosFuncionarios[l][0]) + " - " + nf.format(dadosFuncionarios[l][1]) + " - "
                + nf.format(dadosFuncionarios[l][2]) + " - " + nf.format(dadosFuncionarios[l][3]) + "\n";

    }
    JOptionPane.showMessageDialog(null, str + "\n\n\nTotai: " + nf.format(salarioBrutoTotal) + " - " + nf.format(inssTotal) + " - " + nf.format(impostoDeRendaTotal) + " - " + nf.format(salarioLiquidoTotal));
}

}

1º problema se eu digito que quero registar só 1 funcionário ele me retorna um erro
2º problema se eu registro o primeiro salario com 4.000 ele n calcula a faixa salarial do inss fica como 0,00, porem se o salario do segundo funcionario for 4.000 ele calcula sem problemas, alguém saberia me ajudar? desde ja mt obg!

        if (dadosFuncionarios[1][0] >= 3218.91) {
            dadosFuncionarios[l][1] = 354.47;

Acho que seria:

        if (dadosFuncionarios[l][0] >= 3218.91) {
            dadosFuncionarios[l][1] = 354.47;

Pode ser que tenha mais erros de índice. Sugiro que substitua os acessos nos vetores por métodos, isso diminui a chance de erros:

static String funcionarios[];
static double dadosFuncionarios[][];

public static void iniciarFuncionarios(int qtd) {
    funcionários = new String[qtd];
    dadosFuncionarios = new double[qtd][4];
}

public static String obterNome(int indice) {
    return funcionários[indice];
}

public static double obterSalario(int índice) {
    return dadosFuncionarios[indice][0];
}

public static void atribuirSalario(int índice, double salario) {
    dadosFuncionarios[indice][0] = salario;
}

ok, mt obrigado amigo!