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

1
john smith 29 Мар 2011 в 06:36
Это домашнее задание? что ты уже испробовал?
 – 
Michael Easter
29 Мар 2011 в 06:39
Когда вы говорите, что «типы в текстовом документе неизвестны», вы имеете в виду, что не знаете, является ли текстовый поток UTF-8, ASCII или UTF-16? или вы имеете в виду, что текст также содержит числа, и вы хотите сохранить числа как числа и текстовые (нечисловые) строки как обычный текст?
 – 
yasouser
29 Мар 2011 в 06:41
Нет, это не домашнее задание, и да, оно содержит строку из строк и чисел, я хочу, чтобы код понял, что это такое, а затем применил его к нужному типу переменной.
 – 
john smith
29 Мар 2011 в 06:44

1 ответ

Нет, поскольку информация о типе не содержится в текстовом потоке. Например, представьте, что токенизатор встречает следующий токен:

47

Какой у этого тип? Это может быть String ("47"), byte, int, long, float или double. Все эти типы могли создать этот токен, поэтому невозможно сказать, какой тип был до того, как он был напечатан.

Когда вы анализируете файл, вы уже должны знать, какие типы ожидать, и выдавать ошибку, если они не совпадают.

Класс StringTokenizer возвращает вам только строки. Если вы ожидаете строк, вы можете просто сохранить их в переменную. Если вы ожидаете другой тип, вы должны проанализировать его. Например, если вы прочитали строку "47", вам следует запустить ее через Integer.parseInt. Это либо вернет целое число (например, 47), либо вызовет исключение NumberFormatException, если оно не соответствует. Вы можете захотеть поймать NumberFormatException и сообщить пользователю об ошибке, поскольку текстовый файл не соответствует тому, что вы ожидали.

2
mgiuca 29 Мар 2011 в 06:45
Спасибо, это имеет смысл, но я думал, что есть какой-то метод, чтобы сказать, какой будет следующий токен, потому что я видел только hasMoreTokens();
 – 
john smith
29 Мар 2011 в 06:48
Неа. StringTokenizer работает только с разбиением строк на слова. Как видно из моего ответа, это не имеет ничего общего с преобразованием их в значимые значения (для этого мне пришлось использовать Integer.parseInt). hasMoreTokens просто сообщает, остались ли еще слова до конца строки.
 – 
mgiuca
29 Мар 2011 в 08:05