5

I'm creating a small program that will read a text file, which contains a lot of randomly generated numbers, and produce statistics such as mean, median, and mode. I have created the text file and made sure the name is exactly the same when declared as a new file.

Yes, the file is in the same folder as the class files.

public class GradeStats {
public static void main(String[] args){
    ListCreator lc = new ListCreator(); //create ListCreator object
    lc.getGrades(); //start the grade listing process
    try{
        File gradeList = new File("C:/Users/Casi/IdeaProjects/GradeStats/GradeList");
        FileReader fr = new FileReader(gradeList); 

        BufferedReader bf = new BufferedReader(fr);       

        String line;

        while ((line = bf.readLine()) != null){
            System.out.println(line);
        }
        bf.close();
    }catch(Exception ex){
        ex.printStackTrace();


    }
}

}

Error line reads as follows:

java.io.FileNotFoundException: GradeList.txt (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileReader.<init>(FileReader.java:72)
    at ListCreator.getGrades(ListCreator.java:17)
    at GradeStats.main(GradeStats.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
cmcdaniels
  • 145
  • 1
  • 3
  • 13

2 Answers2

11

How about adding:

String curDir = System.getProperty("user.dir");

Print this out. It will tell you what the current working directory is. Then you should be able to see why it isn't finding the file.

Rather than allowing your code to throw, you could check to allow yourself to do something if the file isn't found:

File GradeList = new File("GradeList.txt");
if(!GradeList.exists()) {
    System.out.println("Failed to find file");
   //do something
}

Please run the below and paste the output:

String curDir = System.getProperty("user.dir");
File GradeList = new File("GradeList.txt");
System.out.println("Current sys dir: " + curDir);
System.out.println("Current abs dir: " + GradeList.getAbsolutePath());
nuzz
  • 647
  • 7
  • 18
  • I tried this and it wouldn't compile, still gives FileNotFoundException. – cmcdaniels May 29 '12 at 01:35
  • Did you print out curDir? What did it say? Where is GradeList located? – nuzz May 29 '12 at 02:35
  • I've added four lines of code to the bottom of my answer. Please run and paste output here – nuzz May 29 '12 at 02:41
  • printing out curDir resulted in C:\Users\Casi\IdeaProjects\GradeStats. The GradeList file is at \GradeStats\src but when using system.out.println(GradeList.getAbsolutePath()) it prints the same path as the curDir. – cmcdaniels May 29 '12 at 02:41
  • Right so if you put: File GradeList = new File("C:\Users\Casi\IdeaProjects\GradeStats\GradeList.txt"); It should find it. Is that where windows explorer shows it as being? – nuzz May 29 '12 at 02:42
  • If the file is at GradeStats\src, you should be able to put either: src/GradeList.txt or C:\Users\Casi\IdeaProjects\GradeStats\src\GradeList.txt both should work – nuzz May 29 '12 at 02:44
  • The four lines at the end compiles: Current sys dir: C:\Users\Casi\IdeaProjects\GradeStats Current abs dir: C:\Users\Casi\IdeaProjects\GradeStats\GradeList.txt – cmcdaniels May 29 '12 at 02:47
  • Right so if I get this right, the file is physically located at: C:\Users\Casi\IdeaProjects\GradeStats\src\GradeList.txt?? If thats correct then put: File GradeList = new File("C:\Users\Casi\IdeaProjects\GradeStats\src\GradeList.txt"); and it will work – nuzz May 29 '12 at 02:50
  • That fixed it! Somehow...it didn't work earlier and I did the exact thing but I guess it works now. Phew. I'm relatively new to Java and programming and general and I tend to get stuck on the smallest things – cmcdaniels May 29 '12 at 02:54
  • Excellent... glad it works for you – nuzz May 29 '12 at 03:59
2

The problem is you have specified only a relative file path and don't know what the "current directory" of your java app is.

Add this code and everything will be clear:

File gradeList = new File("GradeList.txt");
if (!gradeList.exists()) {
    throw new FileNotFoundException("Failed to find file: " + 
        gradeList.getAbsolutePath());
}

By examining the absolute path you will find that the file is not is the current directory.

The other approach is to specify the absolute file path when creating the File object:

File gradeList = new File("/somedir/somesubdir/GradeList.txt");

btw, try to stick to naming conventions: name your variables with a leading lowercase letter, ie gradeList not GradeList

Bohemian
  • 412,405
  • 93
  • 575
  • 722