我的问题在于尝试从另一种方法访问在一个方法中创建的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 ();
}
}
答案 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();
}
}