2013-10-06 33 views
1

我試圖製作一個程序來反轉文件中的文本行。我仍然在學習java,而我對此很陌生。我的程序出錯了,因爲我在循環中創建了一個變量,並試圖在外部訪問它。我試圖在聲明字符串變量之前添加preffix「public」,但是當我嘗試編譯它時,它指向「public」並且表示非法開始表達式。有人可以告訴我爲什麼這是錯誤的,或者如何解決它。表達式字符串的非法開始

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

    public class FileReverser 
    { 
    public static void main(String[] args) 
    throws FileNotFoundException 
{ 
    Scanner console = new Scanner(System.in); 
    System.out.print("File to Reverse: "); 
    String inputFileName = console.next(); 

    System.out.print("Output File: "); 
    String outputFileName = console.next(); 

    FileReader reader = new FileReader(inputFileName); 
    Scanner in = new Scanner(reader); 
    PrintWriter out = new PrintWriter(outputFileName); 

    int number = 0; 

    while (in.hasNextLine()) 
    { 
     String line = in.nextLine(); 
     public String[] lines; 
     lines[number] = line; 
     number++; 
    } 
    int subtract = 0; 
    for (int i;i>lines.length;i++) 
    { 
     out.println(lines[(lines.length-subtract)]); 
     subtract++; 
    } 

    out.close(); 

    } 
    } 
+3

首先要修復:縮進。正確縮進代碼會使所有內容更容易理解。 –

+1

人,請不要低估這個......他有一個真正的問題,如果有人絆倒在這,我們可以避免類似的問題。 –

+0

@AnanthaSharma不錯的想法希望其他用戶像你一樣思考。 –

回答

3

問題:

  • 你聲明linespublic改性劑,這是唯一例如/靜態變量,而不是局部變量。
  • 你永遠不會初始化lines
  • 您正在嘗試使用lines其範圍之外(這是目前while環)
  • 您正在嘗試使用i沒有初始化它,在這裏:

    for (int i;i>lines.length;i++) 
    
  • 您的if條件是錯誤的方法;你想繼續,而ilines.length
  • subtract最初是0,所以訪問lines[lines.length - subtract]將拋出一個異常(因爲它是數組的邊界之外)

您可以用修復這些以下代碼:

// See note later 
String[] lines = new String[1000]; 

while (in.hasNextLine()) { 
    String line = in.nextLine(); 
    lines[number] = line; 
    number++; 
} 
// Get rid of subtract entirely... and only start off at "number" 
// rather than lines.length, as there'll be a bunch of null elements 
for (int i = number - 1; i >= 0; i--) { 
    out.println(lines[i]); 
} 

現在可以工作多達1000行 - 但這是一個很痛苦的侷限性。這將是最好只使用List<String>

List<String> lines = new ArrayList<String>(); 
while (in.hasNextLine()) { 
    lines.add(in.nextLine()); 
} 

然後,你需要使用size(),而不是length,並使用get而非陣列索引來訪問值 - 但它會更乾淨的代碼IMO。

0

這是範圍問題。應該在while循環之外聲明lines。通過在while循環中放入lines,它只能在該循環中使用。如果將它移到外面,則lines的範圍將成爲主要方法。

變量的範圍是可以訪問該變量的程序部分。

這是伯克利一個班的變量和範圍的講義。給它一個閱讀,如果你有時間的話。 http://www.cs.berkeley.edu/~jrs/4/lec/08

0

訪問修飾符(public,private, protected)僅適用於類成員(方法或字段)。

如果您想要訪問由{}限制的範圍以外的變量,這意味着您將該變量定義在錯誤範圍內。例如,如果你定義循環和可變x內,然後想用它的外循環:

for (int i = 0; i < 10; i++) { 
    ..... 
    int x = 6; 
    ..... 
} 

int y = x; // compilation error 

...你居然想在循環之前定義這個變量:

int x = 0; 
for (int i = 0; i < 10; i++) { 
    ..... 
    x = 6; 
    ..... 
} 

int y = x; // not variable is available here