Java 在方法中使用实例变量Linkedlist()-为什么我必须在方法体中创建新的
这是我在这里的第一篇文章。我最近开始对学习Java感兴趣,我阅读了一些初级教程,并将其作为书签保存,还阅读了一些示例代码 现在,在我自己的练习中,我发现了一些奇怪的东西,我在手册/教程/文档中找不到任何令人满意的答案 我制作了一个小类来练习IO和队列样式的对象。这意味着创建一个包含文件名的对象和一个空的linkedlist。然后它有一个读取给定文件的方法,并将其中的行逐个添加到linkedlist队列Java 在方法中使用实例变量Linkedlist()-为什么我必须在方法体中创建新的,java,methods,linked-list,queue,instance-variables,Java,Methods,Linked List,Queue,Instance Variables,这是我在这里的第一篇文章。我最近开始对学习Java感兴趣,我阅读了一些初级教程,并将其作为书签保存,还阅读了一些示例代码 现在,在我自己的练习中,我发现了一些奇怪的东西,我在手册/教程/文档中找不到任何令人满意的答案 我制作了一个小类来练习IO和队列样式的对象。这意味着创建一个包含文件名的对象和一个空的linkedlist。然后它有一个读取给定文件的方法,并将其中的行逐个添加到linkedlist队列 import java.io.BufferedReader; import j
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.LinkedList;
public class Handle
{
public File filehandle;
public LinkedList<String> queue;
Handle (File filename)
{
filehandle=filename;
LinkedList<String> queue = new LinkedList<String>();
}
public void addq()
{
try{
FileReader ava;
ava = new FileReader(filehandle);
//without initializing new linekedlist queue it'll give NPE in queue.add
//why can't it use class/instance variable queue it does fine with filehandle
queue = new LinkedList<String>();
BufferedReader br = null;
String sCurrentLine;
br = new BufferedReader(ava);
while ((sCurrentLine = br.readLine()) != null)
{
queue.add(sCurrentLine);
}
queue.offer("POISON");
}
catch (IOException e) {e.printStackTrace();}
}
所以,谁能给我一个很好的解释,为什么我不能在运行时访问类变量queue in方法,尽管我可以使用filehandle变量。
那么我应该怎么做才能访问它?
尽管我在方法中声明了一个新变量,但有人能告诉我类字段队列是如何被填充的吗。或者handle.queue.poll是否以某种方式检测来自方法的变量?问题在于:
Handle (File filename) {
filehandle=filename;
LinkedList<String> queue = new LinkedList<String>();
}
它不应该抛出NPE。问题在于:
Handle (File filename) {
filehandle=filename;
LinkedList<String> queue = new LinkedList<String>();
}
它不应该抛出NPE。在构造函数中,您声明了一个局部变量队列,隐藏了类变量
Handle (File filename)
{
filehandle=filename;
this.queue = new LinkedList<String>();
}
句柄(文件名)
{
filehandle=文件名;
this.queue=新建LinkedList();
}
在构造函数中,您声明了一个局部变量队列,隐藏了类变量
Handle (File filename)
{
filehandle=filename;
this.queue = new LinkedList<String>();
}
句柄(文件名)
{
filehandle=文件名;
this.queue=新建LinkedList();
}
问题在于链接列表的可见性。它仅在您的私有构造函数中可见。要使用队列LinkedList
,只需在构造函数中写入以下内容:
queue = new LinkedList<String>();
问题在于链接列表的可见性。它仅在您的私有构造函数中可见。要使用队列LinkedList
,只需在构造函数中写入以下内容:
queue = new LinkedList<String>();
看来没有地方在你的代码上触发NPE。
如果提到文件不在位置,它将触发“未找到文件”异常
你能追踪更多的调查吗 看来你的代码上没有发射NPE的地方。
如果提到文件不在位置,它将触发“未找到文件”异常
你能追踪更多的调查吗 Aha所以this.queue=newLinkedList();或队列=新的LinkedList();应该在启动构造函数时创建新队列,而不是隐藏类变量。但是我有LinkedList queue=newLinkedList();会声明一个新变量吗?那么变量名之前的类型声明就是将其从初始化/填充新值等转换为新变量的声明的声明吗?是的,就像这样:在示例代码中,您声明了一个局部变量(通过在它前面加上类型声明)顺便说一句:你不应该在你的类中将实例变量声明为“public”,让它们成为受保护的或私有的-它们是你的类的内部,不应该从外部被破坏。在某种程度上,我希望这个队列对于外部类是可访问的。长期规划是这样的——创建一个类,打开一个文件并开始逐行填充队列。现在,其他类甚至可以在不同的线程中跳入其中的许多类,并开始从队列中“slurping”行。如果不在此类中创建公共队列,您将如何完成此类任务?我们的想法是将其开发成一种“泵”型部件,用于从文件中读取行并向下馈送它们的管道,后者的管道和过滤器等部件可以互换。Aha因此this.queue=new LinkedList();或队列=新的LinkedList();应该在启动构造函数时创建新队列,而不是隐藏类变量。但是我有LinkedList queue=newLinkedList();会声明一个新变量吗?那么变量名之前的类型声明就是将其从初始化/填充新值等转换为新变量的声明的声明吗?是的,就像这样:在示例代码中,您声明了一个局部变量(通过在它前面加上类型声明)顺便说一句:你不应该在你的类中将实例变量声明为“public”,让它们成为受保护的或私有的-它们是你的类的内部,不应该从外部被破坏。在某种程度上,我希望这个队列对于外部类是可访问的。长期规划是这样的——创建一个类,打开一个文件并开始逐行填充队列。现在,其他类甚至可以在不同的线程中跳入其中的许多类,并开始从队列中“slurping”行。如果不在此类中创建公共队列,您将如何完成此类任务?我们的想法是将其开发成一种“泵”型部件,用于从文件中读取行并向下馈送它们的管道,后者的管道和过滤器等部件可以互换。Aha因此this.queue=new LinkedList();或队列=新的LinkedList();应在启动构造函数时创建新队列对象,而不是隐藏类变量。\n但由于我有LinkedList queue=new LinkedList();会声明一个新变量吗?因此,变量名之前的类型声明是将其从初始化/填充新值等转换为新变量的声明的声明?Aha所以this.queue=new LinkedList();或队列=新的LinkedList();应在启动构造函数时创建新队列对象,而不是隐藏类变量。\n但由于我有LinkedList queue=new LinkedList();会声明一个新变量吗?那么变量名之前的类型声明就是将其从初始化/填充新值等转换为新变量的声明的声明?