0

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

我目前正在接受:找不到文件 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<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

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

4

6 回答 6

3

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

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 类所在的文件夹中。

希望这可以帮助。

于 2013-04-05T18:12:20.943 回答
1

如果只需要从这里摆脱 Null Poninter Exception 的错误到

 finally
                       {
                           inFile.close();
                       }  

finally{
         if (inFile!=null){
             inFile.close();
          }
       } 
于 2013-04-05T18:08:33.783 回答
1

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

于 2013-04-05T18:12:50.343 回答
1

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

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

如果你只是bills.txt用来测试你的程序,你总是可以将它移动到你执行程序的目录中。

于 2013-04-05T18:13:11.920 回答
1

NullPointerException正在抛出,因为您试图关闭infile仍然没有被实例化的异常,因为在它可以在您的try-catch块中实例化之前引发了异常。所以你应该改变:

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));
于 2013-04-05T18:14:19.720 回答
1

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

import java.util.ArrayList;
import javax.swing.*;
import java.io.*;

public class TriArrayList {

  static ArrayList<String> arr = new ArrayList<String>();

  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();
  }
}
于 2013-04-05T18:36:31.573 回答