0

ファイルの行数をカウントするプログラムを作成する必要があります。プログラムの起動時にファイルが指定されます。

java CountText textFile.txt

mainメソッドでは、次のコードを使用して、cmdに入力されたファイル名を取得します。

if ( args.length > 0 ) {
    String file = args[0];
}

mainメソッドの外で、このファイル名をもう一度参照したいと思います。

public void Lines() throws Exception {      
    FileReader fr = new FileReader ( file );

シンボルが見つかりません(メインメソッドがパブリックで静的であるため、取得できませんか?)。簡単な解決策のように感じますが、理解できません。

編集:Hovercraft Full Of Eels(またTravis)によって解決されました。これはスコープの問題であり、パラメータを介して文字列をメソッドに渡すことで解決されます。

public class CountText {
public static void main ( String args[] ) throws Exception {
    CountText count = new CountText();

    if ( args.length > 0 ) {
        String file = args[0];
        count.Lines( file );
        count.Words( file );
        count.Characters( file );
    }
}

public void Lines ( String file ) throws Exception {        
    FileReader fr = new FileReader ( file );
4

3 に答える 3

3

ここで発生しているのはスコープの問題です。変数はmain関数で定義されているため、別の関数はそれにアクセスできません。変数ファイルはmain関数に対してローカルであると言います。

Linesメソッド内でファイル変数を使用して文字列引数を受け入れ、それを渡すことができるようにする1つの方法。それは次のようになります

public void Lines( String fileName ) throws Exception {
    // rest of the code here
}

したがって、次のようにメソッドを呼び出すことができます

if ( args.length > 0 ) {
    String file = args[0];
    Lines( file );
}
于 2012-10-12T02:47:21.753 に答える
1

主な方法は、プログラムのエントリポイントです。

mainメソッドは、プログラムロジックを含むクラスとは異なるクラスにある場合もあります。

ファイルパスのプライベートインスタンス変数を宣言し、それをクラスのコンストラクターに渡す必要があります。

mainメソッドで、クラスのインスタンスを作成します。

public class SomeClass {

    private String filePath;

    // this is the constructor of the class
    public SomeClass(String filePath){
        this.filePath = filePath;
    }

    public void lines() throws Exception {      
        FileReader fr = new FileReader ( this.filePath );
        ...
        ...
    }


    public static void main(String[] args) {

        SomeClass o = new SomeClass(args[0]);

    }

}

前に述べたように、SomeClassからmainメソッドを削除して、たとえばMainClassに移動することもできます。

public class MainClass{
    public static void main(String[] args) {

        SomeClass o = new SomeClass(args[0]);

    }
}

また、コマンドラインで複数のファイルを受け取り、SomeClassを複数回インスタンス化してから、各ファイルをバッチで処理することもできます。ファイルパスはインスタンス変数であるため、すべてのオブジェクトが分離され、区別されます。

public class MainClass{
    public static void main(String[] args) {

        List<SomeClass> list = new ArrayList<SomeClass>();

        for(String s: args){
           list.add(new SomeClass(s));  // create an instansce for each filename in args
        }

        for(SomeClass o: list){
           o.lines();    // run method on each file
        }

    }
}

これがOOPの魔法です。

于 2012-10-12T02:55:07.417 に答える
0

fileタイプで名前が付けられたクラスのフィールドを宣言する必要がありますString

このようなもの

public class SomeClass {

private static String file;

public static void main(String[] args) {
file = args[0];
}

}
于 2012-10-12T02:44:36.260 に答える