Переменная внутри цикла является локальной, я хочу сделать ее общедоступной - PullRequest
0 голосов
/ 02 марта 2012
if (a != 1 && solone == (int)solone && soltwo == (int)soltwo){
    // (lx+o)(mx+p)
    int h = (a*c);
    List<Integer> factors = new ArrayList<Integer>();
    for (int i = 1; i < Math.sqrt(h); i++) {
        if (h % i == 0)
            factors.add(i);
    }
    Integer result = null;
    for (int ii: factors) {
        if (b == ii + h/ii){
            result = ii;
            // ax^2+hiix+iix+c
    }
    int hii = h/ii;
    int gcd1 = Euclid.getGcd(a, hii);
    int gcd2 = Euclid.getGcd(ii, c);
    String Factored = FactoredForm.getFF(gcd1, gcd2, a, hii);
}

Моя строка с именем Factored - это та, которую мне нужно использовать для печати позже в моем коде. Я не могу использовать его, потому что он не распознает переменную вне цикла for. Как мне сделать его публичным? Когда я добавил public перед строкой, он сказал, что разрешен только final? Кроме того, я не могу просто переместить посторонний код за пределы цикла for, потому что все зависит от целого числа «ii», которое является частью цикла. Помогите! * * 1002

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Вы действительно хотите, чтобы это было частью состояния экземпляра класса?Если это так, объявите его вне метода:

private string factored;

public void Whatever(...)
{
    factored = FactoredForm.getFF(gcd1, gcd2, a, hii);
}

Я бы посоветовал вам , а не сделать его публичнымЕсли вам нужно предоставить значение, сделайте это через свойство.

Тщательно продумайте, действительно ли оно логически является частью состояния этого класса.Также пересмотрите соглашения об именах, как упоминалось ранее.

0 голосов
/ 02 марта 2012
Атрибут

public относится не к локальной переменной , а к переменной экземпляра .

Внутри тех же объявлений функций следуют два правила:

  • порядок объявления : если локальная переменная еще не была объявлена, вы не можете ее использовать.
  • scoping : если переменная была объявлена ​​внутри области ({ ... }), то вы не можете получить к ней доступ из-за пределов.

Если вы хотите получить доступ к переменной позже в коде, вы должны объявитьэто перед циклом:

String factored;
if (....) {
  ....
  ....
  factored = whatever;
}

System.out.println(factored);

или иметь его в качестве переменной экземпляра (бессмысленно, поскольку это локальная область, которую нужно печатать, но неважно):

class FooBar
{
  String factored;

  void method() {
    ...
    ...
    if (...) {
      ...
      ...
      factored = whatever;
    }

    System.out.println(factored);
  }
}

или в-третьих, вы можетевернуть переменную из метода и использовать ее где-нибудь еще:

class FooBar
{
  String method() {
    ...
    ...
    if (...) {
      ...
      ...
      return whatever;
    }

    return null;
  }

  void otherMethod() {
    String factored = method();
    System.out.println(factored);
  }

}
...