2011-10-05 54 views
0

我的问题在于尝试从另一种方法访问在一个方法中创建的Scanner scan。它说它无法找到变量扫描。我试过宣布全球Scanner scan,但它给了我一个错误,non static variable name cannot be referenced from a static context。我怎样才能访问这个变量?尝试使用另一种方法尝试{}中的扫描仪? --Java

import java.util.*; 
import java.io.*; 

public class MyClass { 
    public static void myMethod() { 
     final File f = new File("file.txt"); 
     Scanner scan = null; 
     try { 
      scan = new Scanner(f); 
     } 
     catch(FileNotFoundException ex) { 
      System.exit(0); 
     } 
    } 

    public static boolean anotherMethod() { 
     final String s = scan.next(); 

     if (s.equalsIgnoreCase ("true")) return true; 
     if (s.equalsIgnoreCase ("false")) return false; 

     throw new java.util.InputMismatchException(); 
    } 
} 
+0

让它作为一类提交'私人扫描仪scan = null;' –

+0

刚刚尝试过,Try {}中的'scan'给了我错误“非静态变量扫描不能从静态上下文中引用”。 :/ –

+0

也张贴在这里:http://www.daniweb.com/software-development/java/threads/385513/1660807#post1660807 –

回答

2

你只是声明了flow方法中的scan变量。如果您想使用其他方法内的值,你需要采取的两项行动之一:

  • 声明它作为一个非本地变量
  • 将它传递到通过的其他方法参数

由于所有的方法都是静态的,对于第一种选择你需要声明为:

private static Scanner scan; 

然而,目前flow方法似乎做两分完全不同的事情:

  • 它创建Scanner(但不实际使用
  • 它试图使用并预期已经阅读

数据这在我看来,你应该在main方法中创建Scanner(或者在readBoolean2D之前调用的新方法中)。您目前正在调用readBoolean2D作为该程序的第一个动作,尝试在尚未创建任何Scanner之前从不存在的变量中读取数据。

注意,这都不是什么做的try块本身 - 这是该变量是在一个单独的方法,它是问题(和方法调用的时间)宣布的事实,try块。

我会尽量想重组方案为:

  • 打开输入
  • 读取所有数据
  • 过程中的所有数据

我怀疑你其实可以逃脱与只是局部变量和参数 - 第一种方法将返回 a Scanner;第二种方法是将作为一个扫描器并返回它读取的数据;第三种方法将采取数据。

1

由于您的方法是静态的,因此scan变量必须是全局变量和静态变量。如果你想从另一个方法,甚至另一个类访问它,它将不得不在全局声明。

import java.util.*; 
import java.io.*; 

public class VerticalPercolation { 

    private static Scanner scanner; 

    public static boolean[][] flow (final boolean[][] open) { 
     // ... 
    } 

    public static boolean percolates (final boolean[][] open) { 
     // ... 
    } 

    public static boolean[][] random (final int n, final double p, final Random rnd) { 
     // ... 
    } 

    public static boolean readBoolean() { 
     // ... 
    } 

    public static boolean[][] readBoolean2D() { 
     // ... 
    } 

    public static void print (final boolean[][] a) { 
     // ... 
    } 

    public static void main (final String[] args) { 
     scanner = new Scanner(...); 
    } 

} 
+0

其实我*不会*在这里使用静态变量 - 我只是使用局部变量和参数。我认为没有理由在这种特殊情况下拥有全局状态除了其他任何事情,这清楚地表明了现有的时间问题 - 我们不能*首先调用'流程',因为我们没有获得数据......但是获取数据,我们需要'扫描仪'。使用'Scanner'作为读取数据的方法的参数,我们需要调用一些东西来创建'Scanner'作为第一个动作。 –

+0

这就是我如何做的,但不知道他的项目布局是怎样的,或者他的编程技巧,我认为最好遵循这个类的布局。 – 2011-10-05 06:14:01

+0

但是他的类的布局不可能工作 - 因为'flow'需要被赋予数据,并且在调用'flow'之前不能读取数据。因此,重组是绝对必要的,我认为值得一提。 –

0
public class VerticalPercolation { 
     private static Scanner scan; 
     //rest of the code 

希望帮助

0

其他的答案建议创建一个静态或全局 - 忽略它们。

您正在使用不使用扫描仪的功能创建扫描仪扫描,请勿在其中创建扫描仪扫描,并在需要的位置创建它。

readBoolean2D和readBoolean每个需要采取的扫描仪作为一个参数:

public static boolean[][] readBoolean2D (Scanner scan) { 

主要是你需要创建和使用扫描仪:

public static void main (final String[] args) throws IOException { 
    final File f = new File("file.txt"); 
    Scanner scan = new Scanner(f); 
    try { 
     final boolean[][] open = readBoolean2D (scan); 
     print (flow (open)); 
     System.out.println (percolates (open)); 
    } finally { 
     scan.close(); 
    } 
}