gpt4 book ai didi

java - 在方法中使用实例变量 Linkedlist() - 为什么我必须在方法体中创建 new

转载 作者:行者123 更新时间:2023-12-01 23:43:26 25 4
gpt4 key购买 nike

这是我在这里发表的第一篇文章。最近开始对学习Java产生兴趣,读了一些初级教程,保留http://docs.oracle.com作为我的书签并阅读了几个示例代码。

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

我制作了一个小类来练习 IO 和队列样式对象。它的目的是创建一个包含文件名的对象和一个空的链表。然后它有一个方法来读取给定的文件,并将该文件中的行一一添加到链表队列中。

    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();}
}

奇怪的事情 - 当尝试使用在类中声明的类变量/实例变量队列(公共(public) LinkedList 队列)时,该队列也在构造函数中启动,在方法内部,它编译得很好,但在运行时它在队列中抛出了 NPE。添加行。当我在方法内部初始化方法变量队列时,NPE 消失了。为什么该方法不能添加到类变量队列中?看来使用 fielhandle 变量就好了!另外,如 poll 方法结果所示,代码运行类(将其发布) - 它似乎仍然实际上将行添加到实例变量队列中,而不仅仅是临时方法变量。 (这当然很好,但我不明白如何以及为什么)下面是我用来运行 Handle 类的代码。

    import java.io.File;
import java.util.LinkedList;
class Runner
{

public static void main(String[] args)
{
File file = new File("proovidest.csv");
Handle handle =new Handle(file);
//using the constructor, now we have object with filehandle and empty queue variables
handle.addq();
String mison;
//so apparently the instance variable queue is still filled with lines (good)
//but how? the method had to delcare its own variable (why), but still the class field is //now filled? how?
while ((mison = handle.queue.poll()) != "POISON")
{System.out.println(mison);}

}
}

所以有人可以给我很好的解释为什么我无法在运行时访问方法中的类变量队列,尽管我可以使用文件句柄变量。那么我应该怎么做才能访问它?谁能告诉我,尽管我在方法中声明了一个新变量,但类字段队列仍然被填满。或者handle.queue.poll是否以某种方式检测变量形式的方法?

最佳答案

问题出在这里:

Handle (File filename) {
filehandle=filename;
LinkedList<String> queue = new LinkedList<String>();
}

您不初始化实例字段queue,而是创建一个具有相同名称的新局部变量,该变量仅在构造函数中有效。将其更改为:

Handle (File filename) {
filehandle=filename;
queue = new LinkedList<String>();
}

并且它不应该抛出 NPE。

关于java - 在方法中使用实例变量 Linkedlist() - 为什么我必须在方法体中创建 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17542872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com