Назначьте переменную внутри скобки «если», как вы используете эту переменную вне скобки? - PullRequest
0 голосов
/ 30 июня 2011

Я создаю программу, которая создает фрактал, и пользователь должен выбрать, какие цвета он должен представлять для фрактала.Единственная проблема заключается в том, что переменная цвета не будет работать вне оператора if.Вот мой код: (Проблема в public void fractalEngine в том, что касается цвета пера. Эти verifiedChoice переменные инициируются внутри оператора if и, похоже, не переносятся на остальную часть кода.)

import java.awt.*;
import java.util.Scanner;

class anotherClass
{
    World worldObj = new World();
    Turtle m = new Turtle(100, 340, worldObj);
    Scanner in = new Scanner(System.in);

    public void hello()
    {
        System.out.println("This program is a fractal engine");
        System.out.println("A fractal shape is a geometric shape that represents"); 
        System.out.println("the whole shape, no matter what level of scale");
        System.out.println();
        System.out.println("Your fractal picture will have three different colors,");
        System.out.println("Please pick three of the following:");
        System.out.println("RED, GREEN, BLUE, ORANGE, BLACK, YELLOW, MAGENTA, PINK");
        System.out.println("NOTE: Type your choices just like they appear.");
        System.out.println();
    }


    public void fractalEngine(int pxLength, String fractalRule)
    {
        System.out.println("Choice #1 out of 3: ");
        String choice1 = in.nextLine();
        if(choice1.equals("RED") || choice1.equals("GREEN") || choice1.equals("BLUE") || choice1.equals("ORANGE") || choice1.equals("BLACK") || choice1.equals("YELLOW") || choice1.equals("MAGENTA") || choice1.equals("PINK"))
        {
            System.out.println("Your first choice has been set to " + choice1);
            String verifiedChoice1 = choice1;
        }
        else
        {
            System.out.println("That choice is not valid, your first choice will now be red");
            String verifiedChoice1 = "RED";
        }



        System.out.println("Choice #2 out of 3: ");
        String choice2 = in.nextLine();
        if(choice2.equals("RED") || choice2.equals("GREEN") || choice2.equals("BLUE") || choice2.equals("ORANGE") || choice2.equals("BLACK") || choice2.equals("YELLOW") || choice2.equals("MAGENTA") || choice2.equals("PINK"))
        {
        System.out.println("Your second choice has been set to " + choice2);
        String verifiedChoice2 = choice2;
        }
        else
        {
            System.out.println("That choice is not valid, your second choice will now be green");
            String verifiedChoice2 = "GREEN";
        }



        System.out.println("Choice #3 out of 3: ");
        String choice3 = in.nextLine();
        if(choice3.equals("RED") || choice3.equals("GREEN") || choice3.equals("BLUE") || choice3.equals("ORANGE") || choice3.equals("BLACK") || choice3.equals("YELLOW") || choice3.equals("MAGENTA") || choice3.equals("PINK"))
        {
            System.out.println("Your thrid choice has been set to " + choice3);
            String verifiedChoice3 = choice3;
        }
        else
        {
            System.out.println("That choice is not valid, your thrid choice will now be blue");
            String verifiedChoice3 = "BLUE";
        }

        m.setHeading(0);
        String subData = "";   
        m.turn(30);
        for(int n = 0; n < fractalRule.length() ; n=n+1)            
        {
            subData = fractalRule.substring(n, n+1);                 

            if(subData.equalsIgnoreCase("F"))
                m.forward(pxLength);
            else if(subData.equals("+"))
                m.turn(120);
            else if(subData.equals("-"))
                m.turn(300);
            else if(subData.equals("1"))
                m.setPenColor(verifiedChoice1);
            else if(subData.equals("2"))
                m.setPenColor(verifiedChoice2);
            else if(subData.equals("3"))
                m.setPenColor(verifiedChoice3);
            else if(subData.equalsIgnoreCase("Q"))              
                m.hide();

        }
    }
}

public class complexFractal
{

    public static void main(String[] args)
    {
       int lineLength = 15;
       String rule = "1F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F-F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F-F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F2+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F-F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F-F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F3+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F-F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-F-F-F+F-F-F-F+F-F+F-F+F-F-F-F+F-FQ";

       anotherClass ac = new anotherClass();

       ac.hello();
       ac.fractalEngine(lineLength, rule);
    }
}

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Это проблема объема. Вы должны извлечь объявление из предложения if и отделить его от экземпляра. Вам, вероятно, придется инициализировать его с нулевым значением, чтобы Java не жаловалась.

Например:

function() {
  String verifiedChoice = null;

  if {
    verifiedChoice = ...
  }
}

Некоторые люди предпочитают инициализировать с помощью "", однако я выбираю ноль, потому что если вы забудете создать его экземпляр позже, вы получите исключения NPE, взаимодействующие с объектом String впоследствии.

2 голосов
/ 30 июня 2011

Внутри вашего public void fractalEngine(int pxLength, String fractalRule) просто объявите локальные переменные справа после символа {:

public void fractalEngine(int pxLength, String fractalRule) {
    String verifiedChoice1  = "";
    String verifiedChoice2  = "";
    String verifiedChoice3  = "";

    //Logic here..

}

Эти локальные переменные видны только внутри блока метода и не могут быть видны вне метода.

Просто убедитесь, что вы удалили слово String, которое вы упомянули в вашем операторе if, и оно может использоваться локально внутри вашего метода.

0 голосов
/ 30 июля 2018

Вы также можете сделать это:

String input = null;
if((input = in.nextLine()).equals("RED")) {
// do something here
}
...