从另一种方法调用Try {}内的扫描仪? --java

时间:2011-10-05 05:55:14

标签: java methods java.util.scanner

我的问题在于尝试从另一种方法访问在一个方法中创建的Scanner scan。它说无法找到变量扫描。我尝试声明全局Scanner scan,但它给了我一个错误non static variable name cannot be referenced from a static context。我该如何访问这个变量?

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

4 个答案:

答案 0 :(得分:2)

您只在scan方法中声明了flow变量。如果要在其他方法中使用该值,则需要采取以下两种方法之一:

  • 将其声明为非本地变量
  • 通过参数
  • 将其传递给其他方法

由于您的所有方法都是静态的,因此对于第一个选项,您需要将其声明为:

private static Scanner scan;

但是,目前flow方法似乎做了两件截然不同的事情:

  • 它会创建Scanner(但实际上并不使用
  • 尝试使用预期已阅读的数据

我认为您应该在Scanner方法中创建main(或者在readBoolean2D之前调用的新方法)。您当前正在调用readBoolean2D作为程序的第一个操作,尝试在创建任何Scanner之前读取不存在的变量。

请注意,这些都与try块本身没有任何关系 - 事实是变量是在一个单独的方法中声明的,这是问题(以及方法调用的时间), try块。

我会尝试将该计划重组为:

  • 打开输入
  • 阅读所有数据
  • 处理所有数据

我怀疑你实际上可以使用 局部变量和参数 - 第一种方法返回 a Scanner;第二种方法接收扫描仪并返回它读取的数据;第三种方法是获取数据。

答案 1 :(得分: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(...);
    }

}

答案 2 :(得分:0)

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

希望有所帮助

答案 3 :(得分:0)

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

您正在使用不使用它的功能创建扫描仪扫描,不要在那里创建它,在需要的地方创建它。

readBoolean2D和readBoolean每个都需要将扫描器作为参数:

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

main是您需要创建和使用扫描仪的地方:

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