教授得到一个java.io.FileNotFoundException,但我没有?

时间:2018-04-27 20:18:04

标签: java filenotfoundexception

我有一个项目用于我的Java类,用户为医院输入患者,然后程序读取文件,用户可以选择将添加的患者修改为文件,将其打印到屏幕或两者。该程序对我来说在NetBeans中完美运行,但在教授的评论中,他说他的编译器得到了一个FileNotFoundException(编辑:它实际上是一个运行时错误),即使我在包中包含了该文件。当我通过电子邮件发送给他时,他只重复说他收到了FileNotFoundException。 这是代码:

    package realworldproblem3;


import java.util.*;
import java.io.*;
public class xyzHospital {

static int numOfPat;
static Scanner input = new Scanner(System.in);
static String inp;
static ArrayList<Patient> p = new ArrayList<>();

public static void main(String[] args) throws IOException {  
   boolean done = false;

           importPatients();
           System.out.print("Add new patients to the report:\n");
           while (done == false){
               addPatient();
               System.out.print("Are you done adding patients? (Y or N)\n");
               inp = input.nextLine();
               switch (inp.toLowerCase()){
                   case "y": done = true;
                   break;
                   case "n": done = false;
                   break;
                   default: System.out.print("You did not enter a valid character. The program will print results then exit.\n\n");
                   done = true;
                   break;
               }

           }
           printAll();

       }






static public void addPatient(){
     numOfPat++;
     Patient pat = new Patient();
     p.add(pat);
     pat.addInfo(numOfPat);
 }

static public void printAll() throws IOException{
    System.out.print("Do you want to output the report to the screen ('S'), to a file ('F'), or both('B')?\n");
    inp = input.next();
    PrintWriter writer = new PrintWriter("XYZHospitalExampleData-1.txt");
    switch (inp.toLowerCase()){
        case "s":
             System.out.print("\t\t\t\t\tXYZ Community Hospital\t\t\n=============================================================================================================\n");
             System.out.printf("%-14s%30s%38s%n", "    Name", "Address", "Payment Information");
             System.out.printf("%-8s%-8s%15s%10s%10s%8s%15s%15s%15s %n", "Last", "First", "Address Line 1", "City", "State", "Zip", "Payment Date", "Payment Amt.","Amount Owed");
             System.out.print("=============================================================================================================\n");
            for(int i = 0; i<numOfPat;i++){
                p.get(i).print();
            }
            break;

        case "f": 
            writer.print(""); //writes over file so there is no duplicate patients
            writer.close();
            for(int i = 0; i<numOfPat;i++){
                p.get(i).printToFile();
            }
            break;

        case "b":
             System.out.print("\t\t\t\t\tXYZ Community Hospital\t\t\n=============================================================================================================\n");
             System.out.printf("%-14s%30s%38s%n", "    Name", "Address", "Payment Information");
             System.out.printf("%-8s%-8s%15s%10s%10s%8s%15s%15s%15s %n", "Last", "First", "Address Line 1", "City", "State", "Zip", "Payment Date", "Payment Amt.","Amount Owed");
             System.out.print("=============================================================================================================\n");
            writer.print("");
            writer.close();
            for(int i = 0; i<numOfPat;i++){
                p.get(i).printToFile();
                p.get(i).print();
            }
            break;
}
}

//each patient from the file is added as a patient object
 static public void importPatients() throws IOException{
     try(Scanner read = new Scanner(new BufferedReader(new FileReader("XYZHospitalExampleData-1.txt")))) {
          while(read.hasNextLine()){ //one more line means that there is another patient to add
                    numOfPat++;
                    read.nextLine();
         }

          read.close();

          try(Scanner r = new Scanner(new BufferedReader(new FileReader("XYZHospitalExampleData-1.txt")))) {
                    for (int j=0; j < numOfPat; j++){

                        String line = r.nextLine();
                        Patient pat = new Patient();
                        p.add(pat);
                        String[] str = line.split("\\^"); //the delimiter ^ is used to separate information in the file

                        for (int i = 0; i < str.length; i++){
                            if(str[i].isEmpty()||str[i].matches("0")||str[i] == null){ //if str[i] is empty, that means that it will be skipped over
                                i++;
                            }
                            switch (i){
                                case 0: p.get(j).ID = Integer.parseInt(str[i]);
                                break;
                                case 1: p.get(j).nameLast = str[i];
                                break;
                                case 2: p.get(j).nameFirst = str[i];
                                break;
                                case 3: p.get(j).address = str[i];
                                break;
                                case 4: p.get(j).opAddr = str[i];
                                break;
                                case 5: p.get(j).city = str[i];
                                break;
                                case 6: p.get(j).state = str[i];
                                break;
                                case 7: p.get(j).zip = Integer.parseInt(str[i]);
                                break;
                                case 8: p.get(j).optZip = Integer.parseInt(str[i]);
                                break;
                                case 9: p.get(j).payDate = str[i];
                                break;
                                case 10: p.get(j).payment = Double.parseDouble(str[i]);
                                break;
                                case 11: p.get(j).owed = Double.parseDouble(str[i]);
                                break;
                                default: System.out.print("Error.\n");
                                break;
                            }
                      }
                    }
                    r.close(); 
                   }
            }
 }
}

以下是患者类:

package realworldproblem3;
import java.util.*;
import java.io.*;


public class Patient {
Scanner input = new Scanner(System.in);
 String nameFirst, nameLast, address, opAddr,city, state, payDate;
 int zip, optZip, ID;
 double owed, payment;


 public void print() {
    System.out.printf("%-8s%-9s%-20s%-10s%-8s%-7s%-15s%-11.2f%-10.2f%n", nameLast, nameFirst, address, city, state, zip, payDate, owed, payment);
 }

 public void printToFile()throws IOException{
    try (PrintWriter writer = new PrintWriter(new FileWriter("XYZHospitalExampleData-1.txt", true))) {
        writer.write(ID + "^" + nameLast+ "^" + nameFirst + "^" + address + "^" + opAddr + "^" + city + "^" + state + "^" + zip + "^" + optZip + "^"+  payDate  + "^" + payment + "^" + owed +"\n");
        writer.close();
    }
 }
 private void setName(){
   System.out.print("Enter patient's first name.\n"); //user is asked for all information
    nameFirst = input.nextLine();                       //first three inputs use nextLine so it consumes the end of line character, so the address will be put in the string correctly.
     System.out.print("Enter patient's last name.\n");  //if next() is used, the address is cut off at the first whitespace and the other elements of the address
    nameLast = input.nextLine();                                //are stored in the upcoming inputs.
    if (nameFirst.isEmpty()||nameLast.isEmpty()){
        System.out.print("You must enter the first and last name.\n");
        setName();
    }
 }
 public String getName(){
     return nameFirst + " " + nameLast;
 }

 private void setAddr(){
      System.out.print("Enter patient's address.\n");
    address = input.nextLine();
    if (address.isEmpty()){
        System.out.print("You must enter the patients address.\n");
        setAddr();
    }
 }
 public String getAddr(){
     return address;
 }

 private void setCity(){
     System.out.print("Enter patient's home city.\n");
    city = input.nextLine();
    if(city.isEmpty()){
        System.out.print("You must enter the patients city.\n");
        setCity();
    }
 }
 public String getCity(){
     return city;
 }

 private void setState(){
      System.out.print("Enter patient's state.\n");
    state = input.nextLine();
    if(state.isEmpty()){
        System.out.print("You must enter the patients state.\n");
        setState();
    }
 }
 public String getState(){
     return state;
 }

 private void setDate(){
      System.out.print("Enter the payment date.\n");
    payDate = input.next();
    if(payDate.isEmpty()){
        System.out.print("You must enter a payment date.\n");
        setDate();
    }
 }
 public String getDate(){
     return payDate;
 }

 private void setZip(){
     System.out.print("Enter patient's zipcode.\n");
    try{
        zip = input.nextInt();
    }
    catch(Exception e){
        System.out.print("You must enter a valid 5-digit zipcode.\n");
        input.next();
        setZip();  //if it says that the setZip call will make the function loop infinitely, it is just a warning, it will not loop infinitely.
    }
    int length = String.valueOf(zip).length();
    if(length != 5 && zip > 0){
      System.out.print("You must enter a valid 5-digit zipcode.\n");
      setZip();        
    }

 }
 public int getZip(){
     return zip;
 }

 private void setOwed(){
     System.out.print("Enter patient's due balance.\n");
    try{
        owed = input.nextDouble();
    }
    catch(Exception e){
        System.out.print("Amount has to be a non-negative number.\n");
        input.next();
        setOwed();
    }
    int length = String.valueOf(owed).length();
    if (owed <0 || length == 0){
        System.out.print("Amount has to be a non-negative number.\n");
        setOwed();
    }
 }
 public double getOwed(){
     return owed;
 }

 private void setPayment(){
      System.out.print("Enter patient's payment amount.\n");
    try{
        payment = input.nextDouble();
    }
    catch(Exception e){
         System.out.print("Payment amount has to be a positive number less than the amount owed.\n");
         input.next();
        setPayment();
    }
    int length = String.valueOf(payment).length();
    if(payment < 0 || length ==0 || payment > owed){
        System.out.print("Payment amount has to be a positive number less than the amount owed.\n");
        setPayment();
    }
 }
 public double getPayment(){
     return payment;
 }

 private void setID(int Id){
     ID = Id;
 }
 public int getID(){
     return ID;
 }

 public void addInfo(int ID){
     setID(ID);
     setName();
     setAddr();
     setCity();
     setState();
     setZip();
     setOwed();
     setPayment();
     setDate();
 }


}

这是文件XYZHospitalExampleData-1.txt:

12345 ^ Jones ^ John ^ 1234试驾^邮箱123 ^测试城市^ IN ^ 11234 ^ 1234 ^ 12/05 / 2015 ^ 250.0 ^ 25000.0 12346 ^ Jones ^ Sara ^ 1234试驾^邮箱123 ^测试城市^ IN ^ 11234 ^ 1234 ^ 12/20/2010 ^ 50.0 ^ 50000.0 12347 ^ Doe ^ John ^ 1235 XYZ Drive ^ null ^测试城市^ IN ^ 11234 ^ 0 ^ 01/05/2016 ^ 350.0 ^ 56799.0 12348 ^ Doe ^ Sara ^ 1235 XYZ Drive ^ null ^测试城市^ IN ^ 11234 ^ 0 ^ 11/09/2017 ^ 100.0 ^ 5020.52 12349 ^ Lawson ^ Lonnie ^ 12 South Drive ^ null ^测试城市^ IN ^ 11236 ^ 0 ^ 03/15 / 2013 ^ 253.51 ^ 25065.52 12349 ^ Anderson ^ Sara ^ 156 North Avenue ^ null ^测试城市^ IN ^ 11246 ^ 0 ^ 05/05 / 2013 ^ 21.33 ^ 251.56 12350 ^史密斯^安迪^ 2455东街^ null ^测试城市^ IN ^ 11246 ^ 0 ^ 12/05/2017 2017 365.21 ^ 2543.33

它从他们的ID开始,以他们欠的金额结束。任何帮助,以了解为什么我的教授的编译器给他一个错误,将不胜感激,我可以做些什么来确保它能够找到该文件,所以我没有再次遇到这个问题。

1 个答案:

答案 0 :(得分:0)

main方法的开头,您调用importPatients,该文件从XYZHospitalExampleData-1.txt文件中读取数据。如果此文件不存在,您将获得异常(在运行时,而不是编译器错误)。

当你的包被解包时,很可能出现了问题。也许文件没有复制到预期的位置,就像那样。解决此问题的方法之一是捕获FileNotFoundException并显示描述出错和预期内容的消息。