无法找出构造函数错误
Cannot figure out constructor error
我已经为以下作业苦苦挣扎了一段时间。作业是创建一个程序,从输入文件中读取文本行,然后确定长度为 1 个字母、2 个字母等的单词的百分比。问题是我的 class 扩展了另一个 class 并且我 运行 遇到了构造函数问题,尽管我看到了 none。
我扩展的class:
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();
}
}
我的class:
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;
}
}
最后我得到的错误是 运行 我的驱动程序 class:
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
当您扩展另一个 class 时,subclass 构造函数中的第一个语句必须是对 superclass 构造函数的调用。如果您不明确地这样做,它将隐式调用 super()
。在您的情况下,超级构造函数需要 String
,但未提供,因此出现错误。
所以你在哪里:
public WordPercentages(String s){
super.fileName = s;
super.scan = new Scanner(new FileReader(fileName));
}
你应该这样做:
public WordPercentages(String s){
super(s);
}
您没有在 WordPercentages
中显式调用超类构造函数,因此 Java 在 FileAccessor
中插入对默认构造函数的隐式调用。对象的超类部分也必须构造。但是,您在 FileAccessor
.
中没有这样的无参数构造函数
您正试图在子类构造函数中初始化对象的超类部分。相反,让超类构造函数来处理它。
public WordPercentages(String s){
super(s);
}
您仍然需要捕获超类构造函数抛出的 IOException
(或声明它 throws IOException
的子类构造函数)。
我已经为以下作业苦苦挣扎了一段时间。作业是创建一个程序,从输入文件中读取文本行,然后确定长度为 1 个字母、2 个字母等的单词的百分比。问题是我的 class 扩展了另一个 class 并且我 运行 遇到了构造函数问题,尽管我看到了 none。
我扩展的class:
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();
}
}
我的class:
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;
}
}
最后我得到的错误是 运行 我的驱动程序 class:
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
当您扩展另一个 class 时,subclass 构造函数中的第一个语句必须是对 superclass 构造函数的调用。如果您不明确地这样做,它将隐式调用 super()
。在您的情况下,超级构造函数需要 String
,但未提供,因此出现错误。
所以你在哪里:
public WordPercentages(String s){
super.fileName = s;
super.scan = new Scanner(new FileReader(fileName));
}
你应该这样做:
public WordPercentages(String s){
super(s);
}
您没有在 WordPercentages
中显式调用超类构造函数,因此 Java 在 FileAccessor
中插入对默认构造函数的隐式调用。对象的超类部分也必须构造。但是,您在 FileAccessor
.
您正试图在子类构造函数中初始化对象的超类部分。相反,让超类构造函数来处理它。
public WordPercentages(String s){
super(s);
}
您仍然需要捕获超类构造函数抛出的 IOException
(或声明它 throws IOException
的子类构造函数)。