我试图读取文件。所以在我的班级' 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()
?
答案 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
访问修饰符。