Umar Zahid
Umar Zahid

Reputation: 17

Return array initialized inside try/catch

I am creating a program which creates reads a file into an array separating which file into a different index value in the array.

static String[] readFile () {
    int count = 0;
    
    try {
        File file = new File("input.txt"); // create file
        Scanner scanner = new Scanner(file); // create scanner associated to file
        
//          counts number of lines
        while (scanner.hasNextLine()) {
            scanner.nextLine();
            count++;
        }
        
//          reads file into array
        while (scanner.hasNextLine()) {
            String[] data = new String[count];
            int len = data.length;
            
            for (int i = 0; i <= len; i++) {
                data[i] = scanner.nextLine();
            }
        }
    } catch (Exception e) {
        System.out.println("File not found!!!");
        System.exit(0);
    }
    
    return data;
}

The problem is that when trying to return the variable data I get an error saying 'cannot resolve symbol data" because it is initialized in a try-catch block. I have tried doing this but it returns the value null because the variable's length is determined by the variable count whose's value is also determined in a catch block. Thanks in advance!

Upvotes: 0

Views: 625

Answers (3)

Anton Tokmakov
Anton Tokmakov

Reputation: 700

You can use @Sweeper advice from comments. It will be looks like this.

        static ArrayList<String> readFile () {
            ArrayList<String> data = new ArrayList<>();
            try {
                File file = new File("input.txt"); // create file
                Scanner scanner = new Scanner(file); // create scanner associated to file
    
                while (scanner.hasNextLine()) {
                    data.add(scanner.nextLine()) ;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return data;
        }

But if you want to stay with your current code, you can initialize data by null out of try block. And also you need to reset Scanner. Your code will be looking something like this. Note, that in the for loop you must use condition <len not <=len.

    static String[] readFile () {
        String[] data = null;
        try {
            File file = new File("input.txt"); // create file
            Scanner scanner = new Scanner(file); // create scanner associated to file

//          counts number of lines
            int count = 0;
            while (scanner.hasNextLine()) {
                scanner.nextLine();
                count++;
            }
            scanner.close(); // don't forget about closing resources
            
            data = new String[count];

//          reads file into array
            scanner = new Scanner(file);   
            for (int i = 0; i < len; i++) {
                data[i] = scanner.nextLine();
            }
            scanner.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }

Upvotes: 1

matt020java
matt020java

Reputation: 49

you are having 2 problems the firsthappens because the variable data is declared in the try-catch block ¿what if an instruction throws an exeption and the variable data is never declared? in this case ¿what is going to be returned?, the solution is to declare the variable data before the try-catch block, the second happens because when you invoke nextLine() the Scanner object mantains its state so when you try to invoke nextLine() again after go through the whole file it is in the last line (there is not next line), you can solve it invoking close() and then initialize the scanner object again this will reset the state:

static String[] readFile () {
        Scanner scanner = null;
        int count = 0;
        String[] data = null;

        try {
            File file = new File("C:\\Users\\Mulé\\Desktop\\doc.txt"); // create file
            scanner = new Scanner(file); // create scanner associated to file


//          counts number of lines
            while (scanner.hasNextLine()) {
                scanner.nextLine();
                count++;
            }
            scanner.close();
            scanner = new Scanner(file);
//          reads file into array
            data = new String[count];

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

                data[i] = scanner.nextLine();
            }

        } catch (Exception e) {
            System.out.println("File not found!!!");
            System.exit(0);
        }

        return data;
    }

Upvotes: 0

Aleksandr Baklanov
Aleksandr Baklanov

Reputation: 500

Here are some similar questions with answers:
Java: Reading a file into an array
Read text file into an array

Also, I want to point at the try-with-resources statement - the Scanner object should be closed or initialized inside it.

Additionally, System.exit(0); is not a good way to stop a method, because all finally blocks around it wouldn't be executed in this case.

Upvotes: 0

Related Questions