DÚVIDA: Erro no código em java

Aparece essa mensagem de erro: java: variable i is already defined in method main(java.lang.String[])

Se puderem dar uma ajuda agradeceria (Acho que resolvi o problema e não sei como, gostaria de saber sobre o erro em si)

O código é esse:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Funcionario[] funcionarios = new Funcionario[5];
        double somaSalario = 0;
        int i;

        for (i = 0; i < funcionarios.length; i++) {
            System.out.println("Informe o nome do funcionário " + (i + 1) + ":");
            String nome = scan.nextLine();
            System.out.println("Informe o salário do funcionário " + (i + 1) + ":");
            double salario = scan.nextDouble();
            scan.nextLine();
            funcionarios[i] = new Funcionario(nome, salario);
            somaSalario += salario;
        }

        double mediaSalarios = somaSalario / funcionarios.length;

        System.out.println("Funcionários com salário acima da média: ");
        for (i = 0; i < funcionarios.length; i++) {
            if (funcionarios[i].getSalario() > mediaSalarios) {
                System.out.println(funcionarios[i].getNome());

            }
        }

        for (i = 0; i < funcionarios.length; i++) {
            if (funcionarios[i].getSalario() > mediaSalarios) {
                funcionarios[i].setSalario(funcionarios[i].getSalario() * 1.05);
            } else {
                funcionarios[i].setSalario(funcionarios[i].getSalario() * 1.1);

            }
        }

        System.out.println("\nFuncionários após o reajuste:");
        for (i = 0; i < funcionarios.length; i++) {
            System.out.println(funcionarios[i]);
        }
    }
}

O erro diz que o variável i já foi definida, provavelmente tu criou um int i dentro do for, já que tu definou o i fora, mas por convenção a galera utiliza o for(int i) mesmo.

entendi, vlw pela ajuda. Achei que era isso mesmo, mas a IDE corrigiu e não consegui ver onde estava o erro (isso aconteceu algumas vezes já)

Acho que resolvi o problema e não sei como, gostaria de saber sobre o erro em si

Sim, resolveu porque o código que vc colocou não dá o erro indicado.

O que daria o erro é se tivesse algo assim:

int i;
for (int i = 0; i < funcionarios.length; i++) {

Pois aí vc teria duas variáveis i sendo definidas (uma antes do for e outra dentro dele). Mas como você faz for (i = 0, quer dizer que você está usando a variável i que foi declarada na linha anterior.

De qualquer forma, eu prefiro remover o primeiro int i e em cada for declarar seu próprio i (ou seja, for (int i = 0 etc). Pois aí você limita o escopo de cada i e fica claro que ele só "existe" ali. Claro que nesse caso específico não faz diferença, mas de forma geral, o ideal é limitar as variáveis ao menor escopo possível, pois isso deixa claro onde ela é usada e em códigos mais complexos, evita colisão de nomes e deixa o código menos confuso.


Se bem que, do segundo loop em diante você só está percorrendo os elementos, e não precisa mais do índice. Então poderia trocar para o enhanced for:

for (Funcionario func : funcionarios) {
    if (func.getSalario() > mediaSalarios) {
        System.out.println(func.getNome());
    }
}

for (Funcionario func : funcionarios) {
    if (func.getSalario() > mediaSalarios) {
        func.setSalario(func.getSalario() * 1.05);
    } else {
        func.setSalario(func.getSalario() * 1.1);
    }
}

System.out.println("\nFuncionários após o reajuste:");
for (Funcionario func : funcionarios) {
    System.out.println(func);
}
Obrigado pela ajuda, bem esclarecedor seu comentário. E nem tinha me atendado que poderia resolver com "enhanced for".

Como já disseram, vc "resolveu" o problema pq seu código não dá mais esse erro específico.

O erro simplesmente diz que você está tentando redefinir uma variável já declarada, basicamente tentando criar duas variáveis com o mesmo nome.

Para loop for, você não precisa criar uma variável index no escopo da classe, você pode criar diretamente no escopo no loop. Inclusive é por isso que o nome 'i' é bem aceito. Uma variável para escopo maior deveria ter um nome mais intuitivo.

Saquei, muito obrigado pela ajuda :)