【问题标题】:Can't Find Symbol - Method Add [duplicate]找不到符号 - 方法添加 [重复]
【发布时间】:2012-04-13 01:32:51
【问题描述】:

我正在开展一个为电影创建虚拟数据库的项目。我有两个类:MovieEntry(用于单个电影条目)和 MovieDatabase(包含数据库并允许添加等的较大类) 我得到的错误是“找不到符号 - 方法添加”,但我在顶部声明了一个 ArrayList。这是我的全部代码,我知道还有其他错误。

**public class MovieDatabase
{
   public ArrayList<String> Database = new ArrayList<String>();

   public MovieDatabase(){
       ArrayList<String> Database = new ArrayList<String>(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 (String title : Database)
          System.out.println(title);
    }

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

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

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

   public ArrayList<MovieEntry> searchYear(int from, int to){
       ArrayList <String> Matches = new ArrayList<String>();
       for(Student s : movies);
          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(){
    String g;
    ArrayList <String> gList = new ArrayList<String>();
    for(Student s : movies){
      String g = s.getGenre();
      if(gList.contains(g) == false){
        gList.add(g);
      }
      return gList.size();
    }
    }
    public int countDirectors(){
     ArrayList <String> dList = new ArrayList<String>();
     for(Student s : movies){
        String d = s.getDirector();
        if(dList.contains(d) == false){
            dList.add(d);
        }
        return dList.size();
     }

     }

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

    }

}**

我也有一个错误,说方法 getYear() 无法找到,即使它在另一个类中,它不是静态的,我正在创建一个调用另一个类的对象 (MovieEntry m)。

编辑:我的 searchTitle 方法仍然出现错误,指出数据库的类型不兼容。有人可以解释我的 for-each 循环的问题吗?我尽我所能地跟着这本书。感谢您迄今为止的所有帮助!

【问题讨论】:

  • 请包含堆栈跟踪。

标签: java database-design


【解决方案1】:

您的构造函数定义了一个隐藏类变量的局部变量Database。正确:

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

主要问题是,当您调用 Database.add(m); 时,您会将 MovieEntry 实例添加到仅支持添加字符串的 ArrayList&lt;String&gt;

public class MovieDatabase
{
   public ArrayList<MovieDatabase> database = new ArrayList<MovieDatabase>();

   public MovieDatabase(){
   }

   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);
    }

【讨论】:

  • 谢谢 jabal,这个答案非常有帮助。但是,我得到的下一个错误涉及 searchTitle 方法。它突出显示“数据库”并显示“不兼容的类型”。那不是 ArrayList 去的地方吗?我对 for-each 循环很陌生,这本书说得很少。
  • searchTitle 中,您犯了同样的错误:您尝试使用字符串遍历MovieEntries 列表。正确: for(MovieEntry me: Database) { System.out.println(me.getTitle()); }
  • Java 建议使用以小写字母开头的名称来命名变量,以将它们与名称以大写字母开头的类区分开来。
【解决方案2】:

在searchYear方法中,Matches.add()应该是Matches.add(s);

【讨论】:

    【解决方案3】:
    for (String s : Database)
       s.getYear();
    

    s 是一个 String 对象,在 String 类中没有像 getYear() 这样的方法。所以方法找不到错误

    【讨论】:

    • @MichaelMoore 首先将前四行代码更改为 public ArrayList Database; public MovieDatabase(){ this.Database = new ArrayList(0); } 然后用错误回复我。
    【解决方案4】:

    这个

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

    应该是

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

    getYear 函数不起作用,因为您有带有字符串对象的数组列表,而字符串对象没有函数 getYear。您必须创建一个新类来扩展 String 并将其放入 arraylist 泛型中。

    【讨论】:

      【解决方案5】:

      主要问题:

      数据库变量应该是私有的,并且不要在构造函数中创建新变量。

      private ArrayList<String> Database;
      
      public MovieDatabase(){
             this.Database = new ArrayList<String>();
          }
      

      您的搜索方法返回列表,但没有返回语句。返回 null,或者初始化空数组列表并返回它。例如:

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

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 2016-05-24
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        相关资源
        最近更新 更多