2013-11-21 62 views
0

我目前正試圖使我的代碼通過使用PrintStream方法生成輸出文件。我的書建議我使用的代碼這一行中我主要的:主「變量輸出已定義在主」PrintStream錯誤

PrintStream output = new PrintStream(new File("results.txt")); 

但是,當我輸入了這行代碼,Java的給了我以下錯誤:

Personality.java:17: error: variable output is already defined in method main(String[]) 
    PrintStream output = new PrintStream(new File("results.txt")); 
       ^
    Personality.java:23: error: cannot find symbol 
     output.println(); 
      ^

我的主要方法目前看起來是這樣的:

public class Personality { 
public static void main (String[] args) throws FileNotFoundException { 
    Scanner input = new Scanner(System.in); 
    intro(); 
    Scanner output = asksForFile(input); 
    PrintStream output = new PrintStream(new File("results.txt")); 
    while(output.hasNextLine()){ 
     int[] aCounts = new int[4]; 
     int[] bCounts = new int[4]; 
     String name = output.nextLine(); 
     String data = output.nextLine(); 
     output.println(); 
     System.out.print(name + ": "); 
     int[] percentB = numberOfAnswers(name, data, aCounts, bCounts); 
     output.print(Arrays.toString(percentB)); 
    output.print(" = "); 
     output.println(determineType(percentB));  
    }  
} 

我從錯誤猜測,我不能有一個單一的方法定義了兩次輸出,但如果我不定義我的輸出,怎麼會我的程序知道是什麼那個sym bol是?另外,如果我已經在main中定義了輸出,還有什麼可以調用它來使PrintStream工作,同時還保持程序的其餘部分運行?

我改名爲「輸出」的變量,在我的主電腦燈,但我得到這個新的錯誤來代替:

Personality.java:34: error: cannot find symbol 
    output.println("This program processes a file of answers to the"); 
    ^
     symbol: variable output 
    location: class Personality 

這是我整個的代碼看起來像此刻:

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

public class Personality { 
    public static void main (String[] args) throws FileNotFoundException { 
     Scanner input = new Scanner(System.in); 
     intro(); 
     Scanner scanner = asksForFile(input); 
     PrintStream output = new PrintStream(new File("results.txt")); 

     while(scanner.hasNextLine()){ 
      int[] aCounts = new int[4]; 
      int[] bCounts = new int[4]; 
      String name = scanner.nextLine(); 
      String data = scanner.nextLine(); 
      output.println(); 
      System.out.print(name + ": "); 
      int[] percentB = numberOfAnswers(name, data, aCounts, bCounts); 
      output.print(Arrays.toString(percentB)); 
     output.print(" = "); 
      output.println(determineType(percentB));  
     }  
    } 

    //Introduces the program 
    public static void intro() { 
     output.println("This program processes a file of answers to the"); 
     output.println("Keirsey Temperament Sorter. It converts the"); 
     output.println("various A and B answers for each person into"); 
     output.println("a sequence of B-percentages and then into a"); 
     output.println("four-letter personality type."); 
     output.println();  
    } 

    //Asks for input file 
    public static Scanner asksForFile(Scanner input) throws FileNotFoundException { 
     output.print("input file name? "); 
     String filename = input.nextLine(); 
     return new Scanner(new File(filename)); 

    } 

    //This while loop puts counts inside arrays 
    public static int[] numberOfAnswers(String name, String data, int[] aCounts, int[] bCounts) throws FileNotFoundException { 
     data = data.toLowerCase(); 
     for (int i = 0; i < data.length(); i++) { 
      int x = ((i % 7) + 1)/2; 
      if (data.charAt(i) == 'a'){ 
       aCounts[x]++; 
      } else if(data.charAt(i) == 'b'){ 
       bCounts[x]++; 
      } 
     } 
     return percentB(aCounts, bCounts); 
    } 

    public static void printOutcome(int[] aCounts, int[] bCounts){ 
     String[] ratios = new String[4]; 
     for(int i = 0; i < 4; i++){ 
      String temp = aCounts[i] + "A-" + bCounts[i] + "B"; 
      ratios[i] = temp; 
     } 
     output.println(Arrays.toString(ratios)); 
    } 

    public static int[] percentB(int[] aCounts, int[] bCounts){ 
     int[] percentB = new int[4]; 
     for(int i = 0; i < 4; i++){ 
      double percent = (double) bCounts[i]/(aCounts[i] + bCounts[i]); 
      percentB[i] = (int) Math.round(percent * 100); 
     } 
     return percentB;  
    } 

    public static String determineType(int[] percentB){ 
     String sub50 = "ESTJ"; 
     String sup50 = "INFP"; 
     String type = ""; 
     for(int i = 0; i < 4; i++){ 
      if(percentB[i] > 50){ 
       type += sup50.charAt(i); 
      } else if(percentB[i] < 50){ 
       type += sub50.charAt(i); 
      } else { 
       type += "X"; 
      } 
     } 
     return type; 
    } 

}

+0

注意:Java不*與JavaScript相關。 – user2864740

+0

對不起!我的代碼仍然出現錯誤!你有什麼想法,爲什麼? – user3015607

+0

密切關注錯誤信息 - 它們是正確的。當前發佈的表單不起作用,因爲'PrintStream output'是'main'方法中的一個*局部變量*,因此'intro'方法中找不到[用於引用變量的符號] * 。 – user2864740

回答

0

該代碼有兩個具有相同名稱的變量,這是不允許的。更改這些變量名之一,並重構代碼:

Scanner output = asksForFile(input); 
PrintStream output = new PrintStream(new File("results.txt")); 

重構版本

public class Personality { 
    public static void main (String[] args) throws FileNotFoundException { 
     Scanner input = new Scanner(System.in); 
     intro(); 
     Scanner scanner = asksForFile(input); 
     PrintStream output = new PrintStream(new File("results.txt")); 

     while(scanner.hasNextLine()){ 
      int[] aCounts = new int[4]; 
      int[] bCounts = new int[4]; 
      String name = scanner.nextLine(); 
      String data = scanner.nextLine(); 
      output.println(); 
      System.out.print(name + ": "); 
      int[] percentB = numberOfAnswers(name, data, aCounts, bCounts); 
      output.print(Arrays.toString(percentB)); 
      output.print(" = "); 
      output.println(determineType(percentB));  
     }  
    } 
} 

注意有在不提供源此代碼片段的幾種方法。鑑於這些未知數,此版本可能需要額外的重構。

+0

我重構了你所說的代碼,但是我仍然收到錯誤!我編輯了主要問題以顯示我得到的錯誤。 – user3015607