与Scanner对象和while循环重复的局部变量错误

时间:2018-09-06 04:26:41

标签: java while-loop java.util.scanner

在用Java传递Scanner对象并使用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 :(得分:0)

在大多数情况下,您不能在一个类中拥有两个具有相同名称的变量,尤其是当它们的作用域相同时(如此处使用相同的方法)。即使对象的类型不同,编译器也无法区分和选择您要使用的对象,因此它将无法编译。

在您提供的代码中,我们可以看到您使用了具有相同名称的声明的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")) {
            }
        }
    }

一般来说,要解决此错误,您可以重命名其中一个变量,但就您而言,我认为甚至没有必要拥有2个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")) {
            }
        }
    }
}