Member 13975893 Ответов: 2

Вопрос инициализации новичка


По какой - то причине это прекрасно работает на Java:
public int intMax(int a, int b, int c) {
  int max;
  if (a > b) {
    max = a;
  } else {
    max = b;
  }
  if (c > max) {
    max = c;
  } 
  return max;
}

Однако, когда я пытаюсь запустить следующее, Я получаю ошибку "переменный вывод, возможно, не был инициализирован":
public int close10(int a, int b) {
  int output;
  if (Math.abs(a - 10) > Math.abs(b - 10)) {
    output = b;
  }
  if (Math.abs(a - 10) < Math.abs(b - 10)) {
    output = a;
  }
  if (Math.abs(a - 10) == Math.abs(b - 10)) {
    output = 0;
  }
  return output;
}

В первом примере "инт-Макс" не было, однако инициализируется, второй "выходной интервал" должен быть инициализирован. Я инициализировал его и дал ему случайное число (1), и он работал нормально, но почему я должен был инициализировать его, а не другой?

Заранее спасибо

Что я уже пробовал:

Немного кода здесь, немного кода там

2 Ответов

Рейтинг:
6

Patrice T

Цитата:
Однако, когда я пытаюсь запустить следующее, Я получаю ошибку "переменный вывод, возможно, не был инициализирован":

Это происходит потому, что этот код находится за пределами понимания компилятора.
Компилятор видит 3 независимых условия, но не может понять, что они дополняют друг друга, и 1 будет достаточно.
Поскольку эти три условия дополняют друг друга, третье является излишним, и тот же логический результат может быть достигнут с помощью:
public int close10(int a, int b) {
  int output;
  if (Math.abs(a - 10) > Math.abs(b - 10)) {
    output = b;
  }
  else if (Math.abs(a - 10) < Math.abs(b - 10)) {
    output = a;
  }
  else {
    output = 0;
  }
  return output;
}


Рейтинг:
16

phil.o

Проблема заключается в следующем: в первом фрагменте кода, max всегда инициализируется (с точки зрения компилятора), так как существует else пункт. Этот else предложение гарантирует, что переменная всегда будет инициализирована.
Здесь нет else предложение во втором фрагменте. Таким образом, опять же с точки зрения компилятора, возможна неинициализация (даже если математически одно из трех условий обязательно будет выполнено).