无法正确启动Reader对象

时间:2014-09-01 08:22:49

标签: java bufferedreader

我试图读取文件。所以在我的班级' Skanner'我有一个看起来像这样的字段:

private Reader reader, readerX;

现在我在构造函数中初始化了这些字段:

public Skanner()
    {   
        try 
        {
            Reader readerX = new FileReader("aliceinwonderland.txt");
            Reader reader = new BufferedReader(readerX);
        } 
        catch (FileNotFoundException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

但是当我尝试使用Skanner类的方法中的字段时,我得到一个空指针异常。如果我在构造函数的try块中使用reader.read()而不会给出任何问题。为什么我不能在我启动它的范围之外调用reader.read()

2 个答案:

答案 0 :(得分:3)

您通过在方法中重新声明实例成员来隐藏它们。从您发布的代码中删除Reader类型声明。

答案 1 :(得分:1)

问题是Reader对象仅在您的构造函数中可用

public Skanner()
    {   
        try 
        {
            Reader readerX = new FileReader("aliceinwonderland.txt");
            Reader reader = new BufferedReader(readerX);
        } 
        catch (FileNotFoundException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

如果您想在构造函数外部访问它们,则需要在构造函数之外声明它们

 Reader readerX;
 Reader reader;

 public Skanner()
        {   
            try 
            {
                  readerX= new FileReader("aliceinwonderland.txt");
                  reader = new BufferedReader(readerX);
            } 
            catch (FileNotFoundException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

public void someMethod(){
//is now available
// make sure you use new Skanner() first before calling this method or it will result to NPE(null pointer exception) because the initialization of reader is in the constructor
reader.read();
}

如果您想在课外访问它们,请使用public访问修饰符。