Переменная g, возможно, не была инициализирована - PullRequest
0 голосов
/ 29 марта 2012

У меня много вопросов об этом проекте, над которым я работаю. Это виртуальная база данных для фильмов. У меня есть небольшой класс MovieEntry (для обработки отдельных записей) и большой класс MovieDatabase, который отслеживает все записи 10k +. Во втором методе searchYear, а также в последующих методах я получаю сообщение об ошибке «переменная g (или d или что-то еще), возможно, не была инициализирована». Я также получаю всплывающую ошибку, которая говорит Warnings from last compilation: unreachable catch clause. thrown type java.io.FileNotFoundException has already been caught. Я положительно озадачен обоими. Вот код:

public class MovieDatabase
{
   private ArrayList<MovieEntry> Database = new ArrayList<MovieEntry>();
   public MovieDatabase(){
       ArrayList<MovieDatabase> Database = new ArrayList<MovieDatabase>(0);
    }

   public int countTitles() throws IOException{
       Scanner fileScan;
       fileScan = new Scanner (new File("movies.txt"));
       int count = 0;
       String movieCount;
       while(fileScan.hasNext()){
           movieCount = fileScan.nextLine();
           count++;
        }
       return count;
    }

   public void addMovie(MovieEntry m){
       Database.add(m);
    }

   public ArrayList<MovieEntry> searchTitle(String substring){
       for (MovieEntry title : Database)
          System.out.println(title);
          return null;
    }

   public ArrayList<MovieEntry> searchGenre(String substring){
       for (MovieEntry genre : Database)
          System.out.println(genre);
          return null;
    }

   public ArrayList<MovieEntry> searchDirector (String str){
       for (MovieEntry director : Database)
          System.out.println(director);
       return null;
    }

   public ArrayList<String> searchYear (int yr){
       ArrayList <String> yearMatches = new ArrayList<String>();
       for (MovieEntry m : Database)
          m.getYear(yr);
       if(yearMatches.contains(yr) == false){
           String sYr = Integer.toString(yr);
           yearMatches.add(sYr);
        }
       return yearMatches;
    }

   public ArrayList<MovieEntry> searchYear(int from, int to){
       ArrayList <String> Matches = new ArrayList<String>();
       for(MovieEntry m : Database);
          m.getYear();
          Matches.add();
       return Matches;
    }

   public void readMovieData(String movies){
       String info;
       try{
           Scanner fileReader = new Scanner(new File("movies"));
           Scanner lineReader;

           while(fileReader.hasNext()){
               info = fileReader.nextLine();

               lineReader = new Scanner(info);
               lineReader.useDelimiter(":");

               String title = lineReader.next();
               String director = lineReader.next();
               String genre = lineReader.next();
               int year = lineReader.nextInt();
            }

        }catch(FileNotFoundException error){
            System.out.println("File not found.");

        }catch(IOException error){
            System.out.println("Oops! Something went wrong.");
        }
    }

   public int countGenres(){
    ArrayList <String> gList = new ArrayList<String>();
    for(MovieEntry m : Database){
      String g = m.getGenre(g);
      if(gList.contains(g) == false){
        gList.add(g);
      }
      return gList.size();
    }
    }

    public int countDirectors(){
     ArrayList <String> dList = new ArrayList<String>();
     for(MovieEntry m : Database){
        String d = m.getDirector(d);
        if(dList.contains(d) == false){
            dList.add(d);
        }
        return dList.size();
     }

     }

    public String listGenres(){
        ArrayList <String> genreList = new ArrayList<String>();
    }




}

Ответы [ 2 ]

2 голосов
/ 29 марта 2012
catch(IOException error){
            System.out.println("Oops! Something went wrong.");
        }

Это говорит вам, что FileNotFoundException будет иметь дело с тем, что ловит IOException, поэтому IOException становится недоступным, так как в нем никогда не будет ловить IO-исключение, почему бы просто не перехватить Exception вместо

Что касается инициализации

public int countDirectors(){
     ArrayList <String> dList = new ArrayList<String>();
     for(MovieEntry m : Database){
        String d = m.getDirector(d);  //THIS LINE
        if(dList.contains(d) == false){
            dList.add(d);
        }
        return dList.size();
     }

Строка String d = m.getDirector(d); может быть проблемой, d не будет инициализирована, если в MovieEntry нет чего-то, и, насколько я вижу, ничего не будет, потому что вы инициализируете это в пустой список массивов

ArrayList<MovieDatabase> Database = new ArrayList<MovieDatabase>(0);

Может быть, вам следует передать массив фильмов в конструктор, а затем добавить эти фильмы в переменную Database?

0 голосов
/ 29 марта 2012

Похоже, с этим кодом есть ряд проблем.

Какой параметр ожидает MovieEntry.getGenre ()?Вы не можете использовать g в этом случае, потому что он еще не был определен.

Упомянутая вами проблема исключения означает, что исключение уже было перехвачено или, возможно, никогда не было выброшено.Я считаю, что в этом случае IOException никогда не выбрасывается из кода в блоке try.

Существует ряд методов, которые должны возвращать значение, но не, например:

public String listGenres(){
    ArrayList <String> genreList = new ArrayList<String>();
}

Кроме того, существует соглашение об именовании Java, в котором используются первые символы нижнего регистра (верблюд)case) для значений:

private ArrayList<MovieEntry> database = new ArrayList<MovieEntry>();

О, и вам нужно повторно инициализировать переменную базы данных в конструкторе?:

public MovieDatabase(){
   ArrayList<MovieDatabase> Database = new ArrayList<MovieDatabase>(0);
}

Надеюсь, это полезно.

...