Я делаю конвертер, который будет преобразовывать числа в текст. Я сделал все, как сказано в этом Веб-сайт, и отредактировал для использования больших целых чисел, но затем показывает, что переменная не инициализирована.
Я отредактировал некоторые вещи, чтобы сделать его совместимым с большими целыми числами для больших чисел, но он просто показывает, что переменная 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;
— это просто объявление, оно не устанавливает никакого значения. Если вы просто хотите избежать Сообщения об ошибках, то пишите String veryFar = "";
.
Вы инициализируете veryFar
, только если result
равно 0
, 1
или -1
. Это означает, что если ни одно из этих условий не выполняется, ваша переменная не будет инициализирована, отсюда и ошибка.
Спасибо вам всем !! Спасибо за помощь
Урезанный, у вас есть этот код:
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
// ...
}
Тогда ваша переменная всегда будет инициализирована.
строковая переменная должна быть инициализирована при объявлении. что касается ошибки, просто скажите
String veryFar = "";
я думаю, что это решит проблему