无法弄清楚构造函数错误

时间:2015-04-15 20:10:01

标签: java inheritance constructor java.util.scanner extends

我一直在努力完成以下任务。分配是创建一个程序,从输入文件中读取文本行,然后确定1个字母长度,2个字母等单词的百分比。问题是我的类扩展了另一个类,我正在运行到构造函数问题,虽然我没有看到。

我的课程延伸:

public abstract class FileAccessor{
  String fileName; 
  Scanner scan;

  public FileAccessor(String f) throws IOException{
    fileName = f;
    scan = new Scanner(new FileReader(fileName));
  }

  public void processFile() { 
    while(scan.hasNext()){
      processLine(scan.nextLine());
    }
    scan.close();
  }

  protected abstract void processLine(String line);

  public void writeToFile(String data, String fileName) throws IOException{
        PrintWriter pw = new PrintWriter(fileName);
      pw.print(data);
      pw.close();
   }
}

我的课程:

import java.util.Scanner;
import java.io.*;

public class WordPercentages extends FileAccessor{
   public WordPercentages(String s){
     super.fileName = s;
     super.scan = new Scanner(new FileReader(fileName));
      }
   public void processLine(String file){
      super.fileName=file;
      int totalWords = 0;
      int[] length = new int[15];
      scan = new Scanner(new FileReader(super.fileName));
      while(super.scan.hasNext()){
         totalWords+=1;
         String s = scan.next();
         if (s.length() < 15){
            length[s.length()]+=1;
            }
         else if(s.length() >= 15){
            length[15]+=1;
            }
      }
   }

   public double[] getWordPercentages(){
      double[] percentages = new double[15];
      for(int j = 1; j < percentages.length; j++){
         percentages[j]+=length[j];
         percentages[j]=(percentages[j]/totalWords)*100;
         }
      return percentages; 
      }
   public double getAvgWordLength(){
      double average;
      for(int j = 1; j<percentages.length; j++){
         average+=(j*percentages[j])/totalWords;
         }
      return average;
      }
}

最后运行我的驱动程序类时出现的错误:

WordPercentages.java:8: error: constructor FileAccessor in class FileAccessor cannot be applied to given types;
   public WordPercentages(String s) {
                                   ^
  required: String
  found: no arguments
  reason: actual and formal argument lists differ in length

2 个答案:

答案 0 :(得分:4)

当您扩展另一个类时,子类构造函数中的第一个语句必须是对超类构造函数的调用。如果您不明确地这样做,它将隐式调用super()。在您的情况下,超级构造函数需要String,这是未提供的,因此是错误。

所以你在哪里:

public WordPercentages(String s){
   super.fileName = s;
   super.scan = new Scanner(new FileReader(fileName));
}

你应该这样做:

public WordPercentages(String s){
   super(s);
}

答案 1 :(得分:3)

您没有在WordPercentages中显式调用超类构造函数,因此Java会在FileAccessor中插入对默认构造函数的隐式调用。必须构造对象的超类部分。但是,FileAccessor中没有这样的无参数构造函数。

您正在尝试初始化子类构造函数中对象的超类部分。相反,让超类构造函数来处理它。

public WordPercentages(String s){
    super(s); 
}

您仍然必须捕获超类构造函数抛出的IOException(或声明子类构造函数throws IOException)。