I am writing a Java program that can take user entries and save them into an ArrayList, then use the ArrayList to open a series of webpages. The program should also be able to read in web addresses from a file. This is where I'm having issues.
I'm currently gettting: The file bills.txt was not found. //the file is in my src folder
Exception in thread "main" java.lang.NullPointerException
at PayBills.main(PayBills.java:92) //this is when the BufferdReader is closed
This isn't homework but the program shares concepts with a homework I am about to do, so I don't want to change anything fundamental about how I'm reading in the text. Any advice is appreciated!
import java.io.*;
import java.util.ArrayList;
public class PayBills implements Serializable
{
/*The purpose of this program is to assist the user in opening a series of webpages to
* pay bills online. The user will be able to save and edit a list of webpages,
* open the newly created list, or read a list from file.
*/
public static void main(String[] args) throws IOException
{
char input1;
String line = new String();
ArrayList<String> list1 = new ArrayList<String>();
Runtime rt = Runtime.getRuntime();
String filename = new String();
try
{
// print out the menu
rt.exec( "rundll32 url.dll,FileProtocolHandler " + "http://www.google.com");
printMenu();
// create a BufferedReader object to read input from a keyboard
InputStreamReader isr = new InputStreamReader (System.in);
BufferedReader stdin = new BufferedReader (isr);
do
{
System.out.println("\nWhat action would you like to perform?");
line = stdin.readLine().trim(); //read a line
input1 = line.charAt(0);
input1 = Character.toUpperCase(input1);
if (line.length() == 1) //check if a user entered only one character
{
switch (input1)
{
case 'A': //Add address process to array
System.out.println("\nPlease enter a web address to add to list:\n");
String str1 = stdin.readLine().trim();
if(str1.startsWith("http://www.") || str1.startsWith("https://www."))
list1.add(str1);
else
{
System.out.println("Please enter a valid web address (starting with http:// or https://).");
}
break;
case 'D': //Show current list
System.out.println(list1.toString());
break;
case 'E': //Execute current list
//rt.exec( "rundll32 url.dll,FileProtocolHandler " + "http://www.speedtest.net");
for(int i = 0; i < list1.size(); i++)
{
Process p1 = Runtime.getRuntime().exec("cmd /c start " + list1.get(i));
}
break;
case 'R': //Read list from file
System.out.println("\nPlease enter the filename to read: ");
{
filename = stdin.readLine().trim();
}
FileReader fr = null;
BufferedReader inFile = null;
try
{
fr = new FileReader(filename);
inFile = new BufferedReader(fr);
line = inFile.readLine();
System.out.println("Test2");
while(line != null)
{
System.out.println("Test3");
if(line.startsWith("http://www.") == false || line.startsWith("https://www.") == false)
System.out.println("Error: File not in proper format.");
else
list1.add(line);
}
System.out.println(filename + " was read.");
}
catch(FileNotFoundException exception)
{
System.out.println("The file " + filename + " was not found.");
break;
}
catch(IOException exception)
{
System.out.println("Error. " + exception);
}
finally
{
inFile.close();
}
break;
case '?': //Display Menu
printMenu();
break;
case 'Q': //Quit
System.out.println("Goodbye!");
System.exit(0);
}//end switch
}//end if
else
System.out.print("Unknown action\n");
}//end do
while (input1 != 'Q' || line.length() != 1);
}
catch(IOException e1)
{
System.out.println("Error: " + e1);
}
}//end main
public static void printMenu()
{
System.out.print("Choice\t\tAction\n" +
"------\t\t------\n" +
"A\t\tAdd Web Address to List\n" +
"D\t\tDisplay Current List\n" +
"E\t\tExecute Current List\n" +
"R\t\tRead List from File\n" +
"?\t\tDisplay Menu\n" +
"Q\t\tQuit\n");
}//end of printMenu()
}//end PayBills
Edit: Ok, the program is no longer crashing because I fixed the NPE, but I am still getting "The file bills.txt was not found.", which is the caught exception. As stated above, the file is located in my src folder so the path should be correct.
If you are just passing the file name, then you have to append the location of the file before reading it
File file = new File(location + filename);
This is how it works if you only pass the filename as the argument to File constructor, it will try to look for the file at /Project/ directory (e.g. c:/workspace/project/test , if your project name is test and is located at c:/workspace/project)
So in order to pass the correct location you have to specify the complete path of the file that you are trying to read
so create the string location which will hold the location of the folder where the file is and then append the file name
String location = "C:/opt/files/";
String filename = "abc.txt";
File file = new File(location + filename);
This abc.txt should be located at "C:/opt/files/"
Remember I have added drive name because you are trying to run main
but if the same code is running on a server you have to specify the path relative to the root directory where the server is running
String location = "/opt/files/";
If you just pass the file name the code will look for the file in project folder not in the folder where your java class is.
Hope this helps.