Java 在方法中使用实例变量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

这是我在这里的第一篇文章。我最近开始对学习Java感兴趣,我阅读了一些初级教程,并将其作为书签保存,还阅读了一些示例代码

现在,在我自己的练习中,我发现了一些奇怪的东西,我在手册/教程/文档中找不到任何令人满意的答案

我制作了一个小类来练习IO和队列样式的对象。这意味着创建一个包含文件名的对象和一个空的linkedlist。然后它有一个读取给定文件的方法,并将其中的行逐个添加到linkedlist队列

    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();会声明一个新变量吗?那么变量名之前的类型声明就是将其从初始化/填充新值等转换为新变量的声明的声明?