Правильный метод для try, catch и, наконец, для Scanner и BufferedReader

#java #try-catch #ioexception

#java #try-catch #исключение ioexception

Вопрос:

Пытаюсь понять наилучший и наиболее эффективный способ для try-catch-finally как для Scanner, так и для BufferedReader в моем основном методе. Должны ли быть два разных перехвата или объединить их в один?

     public static void main(String[] args) throws IOException {
    //open file input stream
    try {
        BufferedReader reader = new BufferedReader(new FileReader("DATABASE.txt"));

        //read file line by line
        String line = null;
        Scanner scan = null;

        BST tree = new BST();
        line = reader.readLine();

        while(line != null) {
            Employee emp = new Employee();
            scan = new Scanner(line);
            scan.useDelimiter(",");

            while(scan.hasNext()){
                emp.setEmployeeID(Integer.parseInt(scan.next()));
                emp.setFirstName(scan.next());
                emp.setLastName(scan.next());
                emp.setSalary(Double.parseDouble(scan.next()));
                line = reader.readLine();
            }
            tree.insert(emp);
        }
        reader.close();
        tree.inOrder();
        //System.out.println(empList);
    } catch(IOException e){
        e.printStackTrace();
    }
  

Ответ №1:

Одного блока catch должно быть достаточно. Вы можете добавить блок finally, который закроет экземпляры reader и scanner (если они не равны null). Таким образом, они будут закрыты независимо от того, завершается ли блок try нормально или генерируется исключение. Следует добавить проверки null, поскольку блок try может не достичь инициализации обоих объектов, поскольку может возникнуть исключение.

Комментарии:

1. Говоря это, должен ли я удалить объект Scanner за пределами инструкции try и просто сохранить созданный экземпляр блока кода внутри?

2. если вы сохраните объекты scanner и reader, объявленные в блоке try, вы не сможете использовать их в блоке finally. Таким образом, вы должны объявить их перед блоком try, но вы должны сохранить инициализацию внутри блока try, чтобы исключение могло быть перехвачено

Ответ №2:

Объявлен Scanner scan = null и BufferedReader reader = null; за пределами блока кода try-catch-finally и инициализировал их внутри блока try. Исключение перехватывается, и они оба достигают блока finally.

 public static void main(String[] args) throws IOException {
    Scanner scan = null;
    BufferedReader reader = null;
    //open file input stream
    try {
        reader = new BufferedReader(new FileReader("DATABASE.txt"));

        //read file line by line
        String line = null;
        Scanner scan = null;

        BST tree = new BST();
        line = reader.readLine();
        scan = new Scanner(line);
        while (line != null) {
            Employee emp = new Employee();
            scan.useDelimiter(",");

            while (scan.hasNext()) {
                emp.setEmployeeID(Integer.parseInt(scan.next()));
                emp.setFirstName(scan.next());
                emp.setLastName(scan.next());
                emp.setSalary(Double.parseDouble(scan.next()));
                line = reader.readLine();
            }
            tree.insert(emp);
        }
    }catch (IOException e) {
        e.printStackTrace();
    } finally {
        reader.close();
        scan.close();
    }
}
  

Ответ №3:

Вам не нужно использовать оба BufferedReader и Scanner . Одного Scanner достаточно:

 public static BST readFile(File file) throws FileNotFoundException {
    try (Scanner scan = new Scanner(file)) {
        scan.useLocale(Locale.US);  // mandatory for read double values

        BST bst = new BST();

        while (scan.hasNext()) {
            Employee employee = new Employee();
            employee.setEmployeeID(scan.nextInt());
            employee.setFirstName(scan.next());
            employee.setLastName(scan.next());
            employee.setSalary(scan.nextDouble());
            bst.insert(employee);
        }

        bst.inOrder();
        return bst;
    }
}