变量g可能尚未初始化

时间:2012-03-29 19:18:48

标签: java initialization try-catch

我对这个项目有很多疑问,我正在研究。它是电影的虚拟数据库。我有一个小的MovieEntry类(用于处理单个条目)和一个跟踪所有10k +条目的大型MovieDatabase类。在我的第二个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 个答案:

答案 0 :(得分:2)

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

它告诉你FileNotFoundException将处理IOException捕获的内容,因此IOException变得无法访问,因为它永远不会捕获IO exceltion,为什么不捕获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变量中?

答案 1 :(得分:0)

似乎此代码存在许多问题。

MovieEntry.getGenre()期望什么参数?在这种情况下你可能不会使用g,因为它尚未定义。

您提到的异常问题意味着异常已被捕获,或者可能永远不会被抛出。我相信在这种情况下,IOException永远不会从try块中的代码中抛出。

有许多方法应该返回值,但不是,例如:

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

此外,对于值使用小写首字符(驼峰大小写)是一种java命名约定:

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

哦,你需要在构造函数中重新初始化数据库变量吗?:

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

希望这有用。