Почему я получаю сообщение об ошибке «незарегистрированное исключение Java.io в коде Java при попытке чтения из текстового файла»?

#java #exception #file-io #try-catch

#java #исключение #file-io #попробуйте-поймайте

Вопрос:

Я новичок в Java, и у меня все еще возникают проблемы.

Я написал код, который считывает все свои данные из текстового файла. Он компилируется нормально, но когда я пытаюсь создать экземпляр кода из другого класса, он выдает следующую ошибку:

«незарегистрированное исключение java.io.FileNotFoundException, должно быть перехвачено или объявлено выброшенным».

Я понимаю, что, вероятно, это проблемы с моими бросками try catch, которые у меня есть и которые я не включил, но я действительно не знаю, как их использовать, и я был бы признателен за некоторую помощь в этом.

Спасибо всем, кто может помочь

Это код

     import java.io.*;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.*;
    import java.util.Scanner;

    public class readTextFile1
    {
        private static int index = 0;
        private static int numberOfDepartmentsToRead;
        private static int i;

        private static  ArrayList<Employee> allEmployees = new ArrayList<Employee>();


        public readTextFile1()
            throws FileNotFoundException
            {

                Scanner inFile = new Scanner (new File("startup.txt") );

                storageSystem theStorageSystem = new storageSystem();       

                numberOfDepartmentsToRead = inFile.nextInt();

                String depName      = inFile.nextLine();
                System.out.println("this is the first one " depName);

                while  (index < numberOfDepartmentsToRead ) 
                {

                    String depName1    = inFile.nextLine();
                    System.out.println("this should be the department name" depName1);
                    String location1     = inFile.nextLine();
                    System.out.println("this should be the location" location1);
                    String numberOfEmps = inFile.nextLine();
                    int    numberOfEmps1 = Integer.parseInt(numberOfEmps);
                    System.out.println("this is the number of employees: " numberOfEmps1);
                    Department newDepartment = new Department(depName1 , location1);
                    theStorageSystem.setDepartment(newDepartment);

                    while (i < numberOfEmps1 )
                    {
                        String fName     = inFile.nextLine();
                        System.out.println("his first name is: " fName);
                        String lName     = inFile.nextLine();
                        System.out.println("his last name is"  lName);
                        String gender    = inFile.nextLine();
                        System.out.println("his gender is: " gender);
                        String address   = inFile.nextLine();
                        System.out.println("his adrs is: " address);
                        String   payLevel  = inFile.nextLine(); 
                        System.out.println("and this is the pay level" payLevel);
                        int dPayLevel = Integer.parseInt(payLevel);
                        Employee employeesFromList = new Employee(fName, lName, gender, dPayLevel, "1er-543");
                        theStorageSystem.setEmployee(employeesFromList);
                        i  ;
                    }   
                    i = 0;
                 index  ;   
                }

                        while (inFile.hasNextLine())
                        {
                            String fName     = inFile.nextLine();
                                System.out.println("his first name is: " fName);
                                String lName     = inFile.nextLine();
                                System.out.println("his last name is"  lName);
                                String gender    = inFile.nextLine();
                                System.out.println("his gender is: " gender);
                                String address   = inFile.nextLine();
                                System.out.println("his adrs is: " address);
                                String   payLevel  = inFile.nextLine(); 
                                System.out.println("and this is the pay level" payLevel);
                                int dPayLevel = Integer.parseInt(payLevel);
                                Employee employeesFromList = new Employee(fName, lName, gender, dPayLevel, "1er-543");
                                theStorageSystem.setEmployee(employeesFromList);
                            //  allEmployees = theStorageSystem.getEmployee();  
                        }

                        }

                    public ArrayList<Employee> giveEmployeeTf()
                    {
                        return allEmployees;
                    }
        }
  

Комментарии:

1. Для более быстрой помощи отправьте сообщение SSCCE .

2. не связано с вопросом, но: обратите внимание, что java имеет строгое соглашение о том, что имена классов должны начинаться с заглавных букв, поэтому вам, вероятно, следует переименовать свои классы: readTextFile1 -> ReadTextFile1 , storageSystem -> StorageSystem

Ответ №1:

Каждый moethod в java должен объявлять исключения, которые он может генерировать [кроме RuntimeException s] . Поскольку ваш метод выдает FileNotFoundException ошибку, он должен выполнить одно из 2 действий:

  1. объявите его как throws FileNotFoundException

  2. используйте try , catch блокируйте и обрабатывайте это исключение.

(*) Вышесказанное относится к активации вашего конструктора, то есть метода, который фактически активирует ctor.

Ответ №2:

Вероятно, вам следует окружить использование readTextFile1() метода блоком try-catch:

 readTextFile1 cls = new readTextFile1();

try
{
    cls.readTextFile1();
}
catch (FileNotFoundException e)
{
    // report error or something
}
  

Кроме того, ваш класс неправильно назван, поскольку он не описывает его использование; похоже, он хранит список Employee объектов и считывает эти данные с помощью этого метода. Вам было бы лучше вызвать класс DepartmentReader или что-то в этом роде (обратите внимание на заглавную букву).

Ответ №3:

Если в вашем коде возможны исключения, у вас есть два варианта:

  • Перехватывать их (и, при необходимости, обрабатывать их) или
  • перестройте их.

Их перехват выполняется блоками, начинающимися с try{} и заканчивающимися catch(Exceptiontype exceptionname) (с необязательным блоком finally{}).

Их дальнейший запуск означает, что вы позволяете стеку вызовов обрабатывать исключение. Для этой цели вы определили свой класс фразой «throws FileNotFoundException». Это означает, что с этого момента при использовании этого метода в любом коде потребуется подтвердить это необязательное исключение, снова либо перехватывая его, либо добавляя его еще выше.

Поэтому всякий раз, когда вы используете описанный выше метод, вам нужно выполнить одно из двух упомянутых действий, и я уверен, что вы пропустили оба.

Ответ №4:

Возможно, вы захотите ознакомиться с исключениями и обработкой исключений.


         public readTextFile1()
            throws FileNotFoundException
  

Это объявляет, что readTextFile1 может выдавать FileNotFoundException , что является так называемым проверяемым исключением. Это означает, что в момент, когда вы вызываете этот метод, вы должны либо перехватить его, либо явно объявить, что вызывающий метод также может выдавать это.

Перехват этого будет работать таким образом:

 readTextFile1 file = new readTextFile1();
try {
    readTextFile1.readTextFile1();
} catch (FileNotFoundException ex) {
    // Here, handle the case that the file is not found. For example:
    System.err.println("File not found");
}
  

(Кстати, имена классов в Java обычно пишутся с большой буквы и должны быть в форме существительного, а не глагола. Например, TextFileReader .)