Вызов сканера в Try {} из другого метода? --Джава - PullRequest
0 голосов
/ 05 октября 2011

Моя проблема заключается в попытке доступа к 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 ]

2 голосов
/ 05 октября 2011

Вы объявили только переменную scan в методе flow.Если вы хотите использовать это значение в других методах, вам необходимо выполнить одно из двух действий:

  • Объявить его как нелокальную переменную
  • Передать егов эти другие методы через параметр

Поскольку все ваши методы являются статическими, для первого варианта вам необходимо объявить его как:

private static Scanner scan;

Однако в настоящее время flow метод, кажется, делает две радикально разные вещи:

  • Он создает Scanner (но на самом деле не использует его)
  • Он пытаетсяиспользовать данные, которые, как он ожидает, уже были прочитаны

Мне кажется, вы должны создать Scanner в своем методе main (или в новом методе, который вызывается до * 1028)*, тем не мение).В настоящее время вы вызываете readBoolean2D как самое первое действие программы, пытаясь прочитать переменную, которая не существует, еще до того, как какая-либо Scanner была создана.

Обратите внимание, что ничего из этогоимеет какое-то отношение к самому блоку try - факт, что переменная объявлена ​​в отдельном методе, является проблемой (и временем вызовов метода), не блок try.

Я бы попытался реструктурировать программу следующим образом:

  • Открытый ввод
  • Считать все данные
  • Обработать все данные

Я подозреваю, что вы действительно можете обойтись с просто локальными переменными и параметрами - первый метод возвратит a Scanner;второй метод будет брать сканер и возвращать данные, которые он читает;третий метод будет принимать данные.

1 голос
/ 05 октября 2011

Переменная 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 голосов
/ 05 октября 2011

Другие ответы предлагают создать статический или глобальный - игнорируйте их.

Вы создаете сканирование сканера в функции, которая его не использует, не создавайте его там, создавайте там, где это необходимо.

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();
    }
}
0 голосов
/ 05 октября 2011
public class VerticalPercolation {
      private static Scanner scan;
      //rest of the code

Надеюсь, что поможет

...