Дублирующая ошибка локальной переменной с объектом Scanner и циклом while - PullRequest
0 голосов
/ 06 сентября 2018

При передаче объекта Scanner в java и использовании цикла while для доступа к каждой строке, ошибка говорит, что у меня есть дублирующаяся локальная переменная («fileContents» в самой первой строке).

    static Map<String, Integer> countCategories(Scanner fileContents) {
    HashMap<String, Integer> categoryCount = new HashMap<String, Integer>();
    while (fileContents.hasNext()) {
        String line = fileContents.nextLine();
        String[] lineItems = line.split(",");

        String category = lineItems[2]; // specified position in CSV file


        if (categoryCount.get(category) == null) {
            categoryCount.put(category, 1);
        } else {
            categoryCount.put(category, categoryCount.get(category) + 1);
        }
    }

Более подробно об этом я просто систематизирую информацию из файла, и я новичок в Java. Правильно ли я делаю этот HashMap или мне нужно отформатировать этот метод и / или хэш-карту, созданную внутри совершенно другим способом?

В соответствии с просьбой, остальные мои основные:

    public class PA2Main {
public static void main(String[] args) {
    try {
        String fileName = args[0];
        Scanner fileContents = new Scanner(new File(fileName)); // temp var

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    // recreate fileContents to use outside of try/catch
    String fileName = args[0];
    Scanner fileContents = new Scanner(new File(fileName));
    HashMap<String, Integer> organizedCategories = countCategories(fileContents); // call function

    if (args.length > 1) {
        if (!"LOCATION".equals(args[1]) || !"CATCOUNT".equals(args[1])) {
            System.out.println("Invalid Command");
        } else {
            //process commands
            if (args[1].equals("CATCOUNT")) {

            }

            if (args[1].equals("LOCATION")) {
            // organize info in fi
            }
        }

    }
}

Форматирование немного странное, но я надеюсь, что это имеет смысл. Очевидно, я не очень много сделал с остальной частью программы, и это не очень чисто. Сообщение об ошибке просто гласит: Дублировать локальную переменную fileContents

И «быстрое исправление» переименовывает его.

1 Ответ

0 голосов
/ 06 сентября 2018

Большую часть времени в классе не может быть двух переменных с одинаковыми именами, особенно если область их действия такая же, как и здесь, и в том и другом методе. Даже если бы тип объекта был другим, у компилятора не было бы возможности различить и выбрать тот, который вы хотите использовать, чтобы он не компилировался.

В приведенном вами коде мы видим, что вы использовали объявленные 2 объекта Scanner с одинаковыми именами, которые будут вызывать ошибку каждый раз, когда вы пытаетесь это сделать.

public static void main(String[] args) {
    try {
        String fileName = args[0];
***     Scanner fileContents = new Scanner(new File(fileName));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String fileName = args[0];
*** Scanner fileContents = new Scanner(new File(fileName));
    HashMap<String, Integer> organizedCategories = countCategories(fileContents); 
    if (args.length > 1) {
        if (!"LOCATION".equals(args[1]) || !"CATCOUNT".equals(args[1])) {
            System.out.println("Invalid Command");
        } else {
            if (args[1].equals("CATCOUNT")) {
            }
            if (args[1].equals("LOCATION")) {
            }
        }
    }

Чтобы вообще исправить эту ошибку, вы можете просто переименовать одну из переменных, но в вашем случае я не думаю, что наличие двух объектов Scanner даже необходимо.

Предложение try-catch следует использовать специально для строк вашего кода, которые имеют реальную возможность вызвать исключение, в этом случае инициализировать сканер.

Более понятный способ написания кода с учетом этого:

public static void main (String[] args) {
    String fileName = args[0];
    Scanner fileContents;
    try {
        fileContents = new Scanner(new File(fileName));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    HashMap<String, Integer> organizedCategories = countCategories(fileContents);
    if (args.length > 1) {
        if (!"LOCATION".equals(args[1]) || !"CATCOUNT".equals(args[1])) {
            System.out.println("Invalid Command");
        } else {
            if (args[1].equals("CATCOUNT")) {
            }
            if (args[1].equals("LOCATION")) {
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...