2011-10-05 52 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(); 
    } 
}