1

そのため、与えられた最後の課題を完了した後、そのコードを取得して、コマンド ライン引数からファイルからのデータの読み取りに変更するように指示されました。ファイルからデータを呼び出し、以前と同じことを行う関数のインターフェイスを持っているはずの部分を除いて、すべてうまくいきます。

現在、私のドライバー クラスのオブジェクト配列には、DAO クラスによって取り込まれた値が割り当てられることが想定されています。DAO クラスはインターフェイスに基づいています。ドライバー クラスは、作成したオブジェクトを DAO クラスの静的関数から割り当てる必要があると叫んでいますが、そのメソッドを静的にすることはできません...

今回見逃したのは…?

インターフェース:

public interface ScanTextFile {

    public Object[] readTextData() throws FileNotFoundException;
}

DAO クラス:

public class StudentDAO implements ScanTextFile {

    public Object[] readTextData() throws FileNotFoundException {

        Student[] studentRecord = new Student[3];

        String dataFileName = "data.txt";
        int numberOfRows = 0;

        File dataFile = new File(dataFileName);
        Scanner scan = new Scanner(dataFile);
        int i = 0;
        String delim = "\\|";

        // checks number of rows in data file, making sure there are 3 total
        for(i = 0; scan.hasNextLine(); i++){
            numberOfRows++;
        }
        if(numberOfRows < 3){
            System.err.format((numberOfRows) + " argument(s) - expected 3");
            System.exit(0);
        } else if(numberOfRows > 3){
            System.err.format((numberOfRows) + " arguments - expected 3");
            System.exit(0);
        }

        for(i = 0; i < numberOfRows; i++){
            if(scan.hasNextLine()){
                String temp = scan.nextLine();
                String[] tempData = new String[4];
                Student tempStudent = null;

                for(i = 0; i < tempData.length ; i++){
                    tempData = temp.split(delim);
                }
                System.out.println("DEBUG *** Finished extracting data, creating object...");
                System.out.println("DEBUG Student Data = [�" + temp + "]");

                GregorianCalendar date = new GregorianCalendar();
                try {
                    date = DateUtil.convertFromDMY(tempData[3]);
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }

                tempStudent = new Student(tempData[0], tempData[1], tempData[2], date);
                studentRecord[i] = tempStudent;
            }
        }

        return studentRecord;
    }

}

ドライバークラス:

public class Lab3 { 

    public void main(String[] args) throws ParseException, FileNotFoundException{

        Student[] allData = new Student[3];
        allData = (Student[]) StudentDAO.readTextData();

        System.out.println("");
        System.out.println("DEBUG *** Student Objects created, displaying all Students...\n");
        for(Student s : allData){
            Print.print(s);
        }
    }
}

編集 エラーを指摘してくれてありがとう、みんなありがとう、でも今は

スレッド「メイン」での例外 java.lang.NoSuchMethodError: メイン

これは、StudentDAO にメインがないためですか?

別の編集

@mprabhat本当にばかげたエラーを指摘してくれてありがとう、どうやってそれを見なかったのかまだわからない><

スキャナーがファイルからデータを読み取ろうとするときに問題が発生しました。

1 - src フォルダーにあるにもかかわらず、データ ファイルが見つからないというメッセージが表示されます。

2 - スキャナー ラインでもエラーが発生しました。ファイルに対してスキャナーを使用すべきではありませんか? ... DataInputStream を使用する必要がありますか?

4

3 に答える 3

0

メソッドreadTextDataは静的ではありませんが、クラス名を使用して静的メソッドのようにアクセスしていますStudentDAO

StudentDAO.readTextData();

代わりにオブジェクトStudentDAOを作成してから呼び出しますreadTextData

Student[] allData = new Student[3];
StudentDAO studentDAO  = new StudentDAO();
allData = (Student[]) studentDAO.readTextData();

Lab3 の問題は、メイン メソッドの正しい署名がないことです。

public static void main(String[] args)は正しい署名です。署名がstaticありません。したがって、取得していますjava.lang.NoSuchMethodError: main

于 2012-06-11T04:58:40.547 に答える
0

クラス Lab3 で、StudentDAO のインスタンスを作成してから、次のようにテキストを読み取ります。

StudentDAO dao = new StudentDAO();
allData = (Student[]) dao.readTextData();
于 2012-06-11T04:59:41.967 に答える
0

基本的に2つのことがあります:

  1. readTextData()静的ではないため、同じ方法でアクセスすることはできません。オブジェクトを作成してから、そのメソッドを呼び出す必要があります。

  2. 3 つの要素の配列を作成し、破棄して新しいデータを入力します。

したがって、基本的にこれを置き換える必要があります:

Student[] allData = new Student[3];
allData = (Student[]) StudentDAO.readTextData();

これとともに:

StudentDAO sDao = new StudentDAO();
Student[] students = (Student[])sDao.readTextData();

完全を期すために、次のようにするとエラーも解消されるはずですが、上記のアプローチをそのまま使用することをお勧めします。

public Object[] readTextData() throws FileNotFoundException;インターフェイス クラスで、 this:を this: に 置き換えますpublic static Object[] readTextData() throws FileNotFoundException;。これにより、readTextDataメソッドが静的になります。DAO ( with public static Object[] readTextData() throws FileNotFoundException;) クラスのメソッド シグネチャを置き換えると、直面しているエラーが解消されます。

于 2012-06-11T04:59:54.543 に答える