在java中编译错误:找不到符号。

我有这个代码,它采用文本文件并将其转换为字符串,然后将字符串的部分分成arraylist的不同元素。

import java.util.Scanner; import java.io.*; import java.util.ArrayList; public class Grocery{ public Grocery(){ File inFile = new File ("lists.txt"); Scanner input = new Scanner (inFile); String grocery; { grocery = input.nextLine(); } } public void makeSmallerLists(){ String listLine; String line; ArrayList smallList = new ArrayList(); while(input.hasNextLine()){ line = input.nextLine; if(line.equals("")){ smallList.add(listLine); } else{ listLine = listLine + "\n" + line; } } } } 

但是,当我尝试编译它时,它给了我两个错误:

javac Message.java Message.java:31:找不到符号符号:变量输入位置:class消息while(input.hasNextLine()){^ Message.java:32:找不到符号符号:变量输入位置:类消息行= input.nextLine; ^

我该如何解决? 我真的不知道出了什么问题。

我修复了,现在我的错误说$ javac Message.java Message.java:34:找不到符号符号:变量nextLine location:class java.util.Scanner line = input.nextLine; ^

  ^ 

现在出了什么问题?

  Scanner input = new Scanner (inFile); 

input是构造函数的本地input ,您无法在其外部访问,并且您尝试访问makeSmallerLists()方法。 将它作为实例成员,使其可以通过除static上下文之外的class

 public class Grocery{ Scanner input; 

并在构造函数中

 public Grocery(){ File inFile = new File ("lists.txt"); input = new Scanner (inFile); 

你有可变范围问题。 您无法访问范围之外的字段。 在构造函数之外将全局声明为Scanner。

  public class Grocery{ Scanner input = null;// Declare Scanner here. public Grocery(){ ..... input=new Scanner (inFile); } 

还附加方法括号()

  public void makeSmallerLists(){ ...... while(input.hasNextLine()){ line = input.nextLine();// Append () after method. ..... } 

这是因为Scanner对象input已在构造函数(构造函数的局部范围)内声明,因此在makeSmallerLists()不可见。 您需要将其声明为实例变量,以便可以在类的所有方法中访问它。

 public class Grocery { Scanner input; // declared here, as an instance variable public Grocery(){ File inFile = new File ("lists.txt"); input = new Scanner (inFile); // initialized here ... } ... public void makeSmallerLists() { ... while(input.hasNextLine()) { // accessible everywhere within the class ... } } 

一种解决方案是拥有Scanner类型的类成员 :

 private Scanner input; 

在构造函数中,构造它:

 public class Grocery { private Scanner input; public Grocery() { ... ... input = new Scanner (inFile); } ... } 

现在input不仅限于构造函数的范围 ,它可以通过整个类访问。


考虑这个例子:

 public class Example { int n = 0; //n known everywhere in the class if(n == 0) { int n1 = 1; if(n1 == 1) { int n2 = 2; //n1 is known here } //n2 is not known here } //n1 is not known here } 

input在构造函数外部是不可访问的…它被声明为构造函数