2012-10-12 35 views
0

我必须写计数在一个文件中的行的程序,在启动程序时的文件中指定了:读取的文件名,并使用它以外主要方法

java CountText textFile.txt 

在main方法我使用此代码来获得在cmd中输入的文件名:

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

以外的主要方法我想再次提及这个文件名:

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

无法找到符号(我没有得到,因为main方法是公共的和静态的?)。我觉得这是一个简单的解决方案,但我无法弄清楚。

编辑:由气垫船完整的鳗鱼(也特拉维斯)解决。这是一个范围问题,它通过将String传递给方法来解决。

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); 
+2

为什么不简单地通过参数传递字符串到方法中:'public void lines(String file){...}'(尽管文件是字符串变量的错误名称 - 你会认为它应该代表一个File对象,而不是String) –

+0

发布您的代码。我想你可能会在上下文之外声明一些变量。 – Ammar

+0

气垫船Full Of Eels解决了这个问题。谢谢你,先生。 – astrimbu

回答

3

什么你遇到这里是一个范围问题。您的变量在主函数中定义,所以其他函数不能访问它。我们说变量文件是本地的主要功能。

在Lines方法中使用文件变量的一种方法,以便它接受一个字符串参数,然后可以传递给它。这看起来就像

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

,那么你可以调用方法,像这样

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

这是解决方案。谢谢! – astrimbu

+0

如果我的答案足以满足您的需求,请点击旁边的复选标记将其标记为已接受。 – Travis

0

你应该在你命名fileString型类中声明的字段。

像这样的事情

public class SomeClass { 

private static String file; 

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

} 
+0

嗯,并且不会抛出一个尝试在静态上下文中使用非静态变量的错误? –

+0

@HovercraftFullOfEels我的不好,我会解决这个问题:p – Austin

1

主要方法是程序的入口点。

主要方法甚至可以在包含程序逻辑的类中。

您必须为文件路径声明一个私有实例变量并将其传递给该类的构造函数。

在主要方法中,您将创建一个类的实例。

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的删除的主要方法之前,并将其移动到,比方说,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 
     } 

    } 
} 

这是魔面向对象的行动!

相关问题