Java error with variable initialization

  • Context: Java 
  • Thread starter Thread starter camel-man
  • Start date Start date
  • Tags Tags
    Error Java Variable
Click For Summary

Discussion Overview

The discussion revolves around a Java programming error related to variable initialization, specifically concerning the Scanner object used for file input. Participants explore the implications of variable scope within try-catch blocks and the behavior of the Java compiler regarding uninitialized variables.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant expresses frustration with Java's strictness compared to C, questioning why variables cannot be declared outside the try block.
  • Another participant argues that the compiler's warnings are justified, noting that if the Scanner initialization fails, the variable would remain uninitialized, leading to potential errors.
  • A third participant suggests a revised code structure that initializes the Scanner variable to null, allowing for better error handling and ensuring that the variable is accessible in the catch block.
  • Another response emphasizes the importance of proper error handling and suggests wrapping each library call in its own try-catch block to manage specific failures effectively.

Areas of Agreement / Disagreement

Participants generally agree on the importance of handling variable initialization and error management in Java, but there are differing opinions on the leniency of programming languages and the best practices for structuring code.

Contextual Notes

There are unresolved issues regarding the handling of exceptions and the implications of variable scope within try-catch blocks. The discussion does not reach a consensus on the best approach to take.

camel-man
Messages
76
Reaction score
0
Code:
import java.util.Scanner;
import java.io.FileNotFoundException; 
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class CountryPopulationReverse{

   public static void main(String args[])throws FileNotFoundException {
   
   //Variable declarations
      Scanner in = new Scanner(System.in);
      Scanner FileIn;
      FileReader inputFile;
      String population, country;
      int checkNum;
      PrintWriter output;
      boolean good = true;
      
     
      try
      {
      System.out.print("Input file: ");
      String inputName = in.nextLine();
      inputFile = new FileReader(inputName);
      FileIn = new Scanner(inputFile);
      System.out.print("Output file: ");
      String outputName = in.nextLine();
      output = new PrintWriter(outputName);
      }catch(FileNotFoundException e){ System.out.println("File not found.");}
      
     while(good)
     {
      try
      { 
      /*
      System.out.print("Input file: ");
      String inputName = in.nextLine();
      inputFile = new FileReader(inputName);
      FileIn = new Scanner(inputFile);
      System.out.print("Output file: ");
      String outputName = in.nextLine();
      output = new PrintWriter(outputName);
      */
     
      
            while(FileIn.hasNextLine())
            {
               while(!FileIn.hasNextInt())
               {
                    country = FileIn.next();
                    output.print(country);     
               }
               
               population = FileIn.next();
              
               checkNum = Integer.parseInt(population);
               output.println(checkNum);
               System.out.println(checkNum);
               if(checkNum<=5)
                   throw new BadDataException("Population (" + checkNum + ") is too low.");
               if(checkNum>2000000000)
                  throw new BadDataException("Population (" + checkNum + ") is too high.");
                 
            }
           output.close();
           good=false;
      
      } catch (FileNotFoundException e){ System.out.println("File not found.");}
        catch (BadDataException e) { System.out.println("Bad Data: " + e.getMessage());}
        catch (NumberFormatException e) { System.out.println("Number Format Exception found.");}
        
     }//End while loop
     
   }
}

Code:
CountryPopulationReverse.java:46: error: variable FileIn might not have been initialized
            while(FileIn.hasNextLine())

Not understanding java right now Why can't I declare these variables outside the try block?!?? I hate java I would rather do C it is so much more lenient.

Only time this program compiles is when I remove the innner comments of the try block and delete the top portion.
 
Technology news on Phys.org
camel-man said:
Not understanding java right now Why can't I declare these variables outside the try block?!?? I hate java I would rather do C it is so much more lenient.

Only time this program compiles is when I remove the innner comments of the try block and delete the top portion.

Lenient isn't always good. The compiler complaints usually are there for a reason. For example, the compiler is quite right here. If that Scanner(File) call throws FileNotFoundException in the first try/catch block, you just print something in the catch part. Now, between those 2 try/catch blocks, the FileIn variable could in fact be not initialized.

And it's with that that you enter the second try/catch block. You didn't really handle the error in a good way, here. I'm going to side with the compiler on this one, I'm afraid. :)

BTW, the indentation doesn't really help make it easy to read. Good formatting and clarity are some of the key aspects of good code.
 
Last edited:
  • Like
Likes   Reactions: 1 person
If by "lenient" you mean it doesn't complain, when you put a bug in your code that could cause all kinds of undefined behaviour.
I'm not entirely shure what your code is supposed to do but I'm guessing it should look more like this.

Code:
public class CountryPopulationReverse {

    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        Scanner FileIn = null;
        PrintWriter output = null;

        try
        {
            System.out.print("Input file: ");
            String inputName = in.nextLine();
            FileReader inputFile = new FileReader(inputName);
            FileIn = new Scanner(inputFile);
            System.out.print("Output file: ");
            String outputName = in.nextLine();
            output = new PrintWriter(outputName);
            while(FileIn.hasNextLine())
            {
               while(!FileIn.hasNextInt())
               {
                    String country = FileIn.next();
                    output.print(country);     
               }
               
               String population = FileIn.next();
              
               int checkNum = Integer.parseInt(population);
               output.println(checkNum);
               System.out.println(checkNum);
               if(checkNum<=5)
                   throw new BadDataException("Population (" + checkNum + ") is too low.");
               if(checkNum>2000000000)
                  throw new BadDataException("Population (" + checkNum + ") is too high.");
                 
            }
        } catch(FileNotFoundException e){ System.out.println("File not found.");}
          catch (BadDataException e) { System.out.println("Bad Data: " + e.getMessage());}
          catch (NumberFormatException e) { System.out.println("Number Format Exception found.");}
          finally {
            if(output != null) {
                output.flush();
                output.close();
            }
            if(FileIn != null) FileIn.close();
          }
    }
}
 
  • Like
Likes   Reactions: 1 person
You can probably squelsh that error like this:

Scanner FileIn = null;

It's really warning you about something important, though. I see you are trying to do something with FileIn in your catch statement, and since the initialization of FileIn is in the try block, the catch block will not see that it has been initialized. Sure enough, it will be null, but you seem to assume it might not be at that point, and that is what the compiler is really upset about.

It is generally worthwhile to put a try-catch structure around every library call (such as initialization of a Scanner), because that specific initialization can fail. Having the try catch just for that part allows you the option to tailor an error message (or set a condition flag) for that specific failure.
 
Last edited:

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 1 ·
Replies
1
Views
2K
Replies
1
Views
8K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 19 ·
Replies
19
Views
3K
  • · Replies 28 ·
Replies
28
Views
4K
Replies
1
Views
2K