Грешка на PrintStream в изхода на основната променлива вече е дефинирана в main

В момента се опитвам да накарам моя код да генерира изходен файл, като използвам метода 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));    
    }       
}

Предполагам от грешката, че не мога да имам дефиниран изход два пъти в един метод, но ако не дефинирам изхода си, как програмата ми ще знае какъв е този символ? Освен това, ако вече имам дефиниране на изход в рамките на main, как иначе мога да го нарека, за да накарам PrintStream да работи, като същевременно поддържам и останалата част от програмата да работи?

Преименувах променливите на "изход" в моя main на скенер, но вместо това получавам тази нова грешка:

    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;
    }

}


person user3015607    schedule 21.11.2013    source източник
comment
Внимание: Java не е свързана с JavaScript.   -  person user2864740    schedule 21.11.2013
comment
Съжалявам за това! Все още получавам грешки в кода си! Имате ли идея защо?   -  person user3015607    schedule 21.11.2013
comment
Обърнете внимание на съобщенията за грешки - те са правилни. Текущо публикуваният формуляр не работи, защото PrintStream output е локална променлива в метода main и по този начин [символът, който трябваше да препраща към променлива] не може да бъде намерен в методът intro.   -  person user2864740    schedule 21.11.2013
comment
(Бих накарал intro да вземе PrintStream обект като аргумент.)   -  person user2864740    schedule 21.11.2013


Отговори (1)


Кодът има две променливи с едно и също име, което не е позволено. Променете едно от тези имена на променливи и преработете кода:

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));    
        }       
    }
}

ЗАБЕЛЕЖКА В този кодов фрагмент има няколко метода, за които източникът не е предоставен. Тази версия може да се нуждае от допълнително преработване предвид тези неизвестни.

person Kevin Bowersox    schedule 21.11.2013
comment
Преработих кода, както казахте, но все още получавам грешки! Редактирах основния въпрос, за да покажа какви грешки получавам. - person user3015607; 21.11.2013