Получение ошибки «переменная veryFar, возможно, не была инициализирована» с BigInteger

Я делаю конвертер, который будет преобразовывать числа в текст. Я сделал все, как сказано в этом Веб-сайт, и отредактировал для использования больших целых чисел, но затем показывает, что переменная не инициализирована.

Я отредактировал некоторые вещи, чтобы сделать его совместимым с большими целыми числами для больших чисел, но он просто показывает, что переменная veryFar может быть не инициализирована. (Я отредактировал имя переменной, чтобы попытаться исправить это!).

package com.example.convertnumbertotext;

import java.math.BigInteger;
import java.text.DecimalFormat;

public class EnglishNumberToWords {

    private static BigInteger bi = new BigInteger("100");
    private static BigInteger bi2 = new BigInteger("20");
    private static BigInteger bi3 = new BigInteger("10");
    private static final String[] tensNames = { "", " ten", " twenty", " thirty", " forty",
            " fifty", " sixty", " seventy", " eighty", " ninety" };

    private static final String[] numNames = { "", " one", " two", " three", " four", " five",
            " six", " seven", " eight", " nine", " ten", " eleven", " twelve", " thirteen",
            " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen" };

    private static String convertLessThanOneThousand(BigInteger number) {
        String veryFar;
        BigInteger[] bii = number.divideAndRemainder(bi);
        BigInteger[] bii2 = number.divideAndRemainder(bi3);
        int resut = bii[1].compareTo(bi2);

        if (resut == -1) {
            veryFar = numNames[bii[1].intValue()];

            number = number.divide(bi);
        } else if (resut == 1 || resut == 0) {
            veryFar = numNames[bii2[1].intValue()];
            number = number.divide(bi3);

            veryFar = tensNames[bii2[1].intValue()] + veryFar;
            number = number.divide(bi3);
        }
        if (number.compareTo(BigInteger.valueOf(0)) == 0)
            return veryFar;
            return numNames[number.intValue()] + " hundred" + veryFar;
    }

}

Он показывает 2 одинаковых сообщения об ошибках- ошибка: переменная veryFar могла быть не инициализирована ошибка: переменная veryFar могла быть не инициализирована

строковая переменная должна быть инициализирована при объявлении. что касается ошибки, просто скажите String veryFar = ""; я думаю, что это решит проблему

madhu s 29.05.2019 08:38

Вы не инициализировали его, что может вызвать проблемы: String veryFar; — это просто объявление, оно не устанавливает никакого значения. Если вы просто хотите избежать Сообщения об ошибках, то пишите String veryFar = "";.

deHaar 29.05.2019 08:38

Вы инициализируете veryFar, только если result равно 0, 1 или -1. Это означает, что если ни одно из этих условий не выполняется, ваша переменная не будет инициализирована, отсюда и ошибка.

BackSlash 29.05.2019 08:39

Спасибо вам всем !! Спасибо за помощь

Demon App Programmer 29.05.2019 08:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Урезанный, у вас есть этот код:

String veryFar;
...
if (resut == -1) {
    veryFar = numNames[bii[1].intValue()];
    ...
} else if (resut == 1 || resut == 0) {
    veryFar = numNames[bii2[1].intValue()];
    ...
}

Если результат не равен -1, 0 или 1, ни один из этих блоков не будет выполнен. В этом случае veryFar никогда не будет присвоено значение.

Либо инициализируйте его при объявлении (например, String veryFar = null), либо добавьте случай else, который присваивает ему значение.

Обратите внимание, что контракт compareTo заключается в том, что он возвращает <0, 0 или >0, нет-1, 0 или 1.

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

Таким образом, измените свои условия на:

if (resut < 0) { // instead of == -1
  // ...
} else { // instead of == 0 || == 1
  // ...
}

Тогда ваша переменная всегда будет инициализирована.

Другие вопросы по теме