Java无法从文件中读取

我正在编写一个Java程序,它可以获取用户条目并将它们保存到ArrayList中,然后使用ArrayList打开一系列网页。 该程序还应该能够从文件中读取Web地址。 这是我遇到问题的地方。

我目前正在接受:找不到文件bills.txt。 //文件在我的src文件夹中

Exception in thread "main" java.lang.NullPointerException at PayBills.main(PayBills.java:92) //this is when the BufferdReader is closed 

这不是家庭作业,但程序与我即将完成的作业共享概念,所以我不想改变任何关于我如何阅读文本的基本内容。 任何建议表示赞赏!

 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 list1 = new ArrayList(); 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 

编辑:好的,程序不再崩溃,因为我修复了NPE,但我仍然得到“找不到文件bills.txt。”,这是被捕获的exception。 如上所述,该文件位于我的src文件夹中,因此路径应该是正确的。

如果您只是传递文件名,则必须在读取之前附加文件的位置

 File file = new File(location + filename); 

如果你只将文件名作为参数传递给File构造函数,它会如何工作,它将尝试在/ Project /目录中查找文件(例如c:/ workspace / project / test,如果你的项目名称是test并且是位于c:/ workspace / project)

因此,为了传递正确的位置,您必须指定要尝试读取的文件的完整路径

所以创建一个字符串位置,它将保存文件所在文件夹的位置,然后附加文件名

 String location = "C:/opt/files/"; String filename = "abc.txt"; File file = new File(location + filename); 

这个abc.txt应该位于“C:/ opt / files /”

请记住,我添加了驱动器名称,因为您正在尝试运行main

但是如果在服务器上运行相同的代码,则必须指定相对于运行服务器的根目录的路径

 String location = "/opt/files/"; 

如果只传递文件名,代码将在项目文件夹中查找不在java类所在文件夹中的文件。

希望这可以帮助。

如果只是必须从Null Poninter Exception中解决出错

  finally { inFile.close(); } 

 finally{ if (inFile!=null){ inFile.close(); } } 

如果您只是提供文件名,请将文件放在主程序所在的位置,或将文件名作为absoulte路径,如c:\ myBills.txt

如果我正确理解您的问题,您遇到的问题是您正在查找错误的目录。 Java将查找相对于您的工作目录的文件。

例如,如果您在~/project中执行程序并且您的文件位于~/foo ,则需要将"..foo/bills.txt"作为文件路径传递,或者等效地传递"~/foo"

如果您只是使用bills.txt来测试程序,则可以始终将其移动到执行程序的目录。

NullPointerException正在抛出,因为您正在尝试关闭仍未实例化的infile ,因为在它可以在try-catch块中实例化之前引发的exception。 所以你应该改变:

 finally { inFile.close(); } 

 finally { try { if(infile!=null) inFile.close(); }catch(Exception ee){} } 

NPE解决后。 您可以通过以下方式访问“Bill.txt”文件。 请改用此代码:

 fr = new FileReader(new File(System.getProperty("home.dir"), filename)); 

这可能不是解决方案,但可能会使用其中的一些,JFileChoser,看看它是如何在Stream中移动的,希望它有所帮助。

 import java.util.ArrayList; import javax.swing.*; import java.io.*; public class TriArrayList { static ArrayList arr = new ArrayList(); public static void imprimer(){ System.out.println (arr); } public static void tri(){ for (int i=0; i+1 < arr.size(); i++) { int a = arr.get(i).compareTo(arr.get(i+1)); if (a > 0) { String b = arr.get(i); arr.set(i, arr.get(i+1)); arr.set(i+1, b); if (i != 0) i -= 2; } } } public static void main(String args[]){ try { JFileChooser dial = new JFileChooser(); int res = dial.showOpenDialog(null); if (res == JFileChooser.APPROVE_OPTION) { File f = dial.getSelectedFile(); InputStream is = new FileInputStream(f); Reader r = new InputStreamReader(is); BufferedReader br = new BufferedReader(r); String line; while ((line = br.readLine()) != null) { line += "\n"; arr.add(line); } is.close(); } } catch (IOException e) { System.err.println("Problème de lecture du fichier blablabla.txt"); } tri(); imprimer(); } }