Что делает тип, сопровождаемый _t (подчеркивание-t), представляют?

А RuntimeException может быть брошен любым кодом. Другими словами, компилятор не может легко предсказать, какой код может его бросить. А RuntimeException может быть захвачен блоком catch(Exception e).

IOException, однако, является проверенным исключением - только вызовы метода, объявленные для его броска, могут это сделать. Компилятор может (разумно) уверенно, что это невозможно, если нет вызовов методов, которые объявляются для его броска.

Компилятор Java просто не считает, что «нет никакого кода вообще блок «try block» - он всегда позволяет вам исключать неконтролируемые исключения, так как во всех разумных сценариях будет существовать код, который мог бы потенциально выбросить исключенное исключение.

Из раздела раздела 14.21 JLS:

Блок catch C доступен, если выполняются оба значения:

  • ] Некоторый оператор выражения или throw в блоке try доступен и может генерировать исключение, тип которого присваивается параметру предложения catch. (Выражение считается достижимым, если внутреннее утверждение, содержащее его, доступно.)
  • В заявлении try нет ранее блока catch A, так что тип параметра C такой же, как или подкласс типа параметра A.
blockquote>

Возможно, компилятор должен понять, что в вашем блоке есть no выражения в блоке try ... похоже, что это еще недостижимое предложение catch , для меня.

EDIT: Как отмечено в комментариях, в разделе 14.20 содержится следующее:

Это ошибка времени компиляции, если a catch исключает тип исключенного исключения E1 , но не существует типа исключенного исключения E2 , для которого выполняются все следующие функции:

  • E2 & lt ;: E1
  • Блок try, соответствующий предложению catch, может вызывать E2
  • Ни один предшествующий блок catch непосредственно входящего оператора try не улавливает E2 или супертип E2 .

, если только E1 - это исключение класса.

blockquote>

Итак, похоже, что вы на самом деле на самом деле , но spec не насколько это было возможно в плане недостижимых блоков catch в 14 0,21.

240
задан Josh Lee 7 September 2009 в 14:50
поделиться

8 ответов

Как Douglas Mayle отметил, это в основном обозначает имя типа. Следовательно, Вам не рекомендовалось бы закончить имена переменной или имена функций с' _t', так как это могло вызвать некоторый беспорядок. А также size_t, стандарт C89 определяет wchar_t, off_t, ptrdiff_t, и вероятно некоторые другие, которых я забыл. Стандарт C99 определяет много дополнительных типов, такой как uintptr_t, intmax_t, int8_t, uint_least16_t, uint_fast32_t, и так далее. Эти новые типы официально определяются в [1 110], но чаще всего Вы будете использовать <inttypes.h>, который (необычно для стандарта C заголовки) включает <stdint.h>. Это (<inttypes.h>) также определяет макросы для использования с printf() и scanf().

, Поскольку Matt Curtis отметил, нет никакого значения для компилятора в суффиксе; это - ориентируемое на пользователя соглашение.

Однако необходимо также отметить, что POSIX определяет много дополнительных имен типов, заканчивающихся в' _t', и резервы суффикс для реализации. Это означает, что, если Вы работаете над связанными с POSIX системами, определение Ваших собственных имен типов с соглашением опрометчиво. Система я продолжаю работать, делала его (больше 20 лет); мы регулярно сбиваемся с толку системами, определяющими типы с тем же именем, как мы определяем.

195
ответ дан Community 23 November 2019 в 03:19
поделиться

Это - соглашение, используемое для именования типов данных, например, с typedef:


typedef struct {
  char* model;
  int year;
...
} car_t;

46
ответ дан mmacaulay 23 November 2019 в 03:19
поделиться

Это - стандартное соглашение о присвоении имен для типов данных, обычно определяемых определениями типов. Много кода C, который имеет дело с аппаратными регистрами, использует C99-определенные стандартные имена для и неподписанных типов данных фиксированного размера со знаком. Как соглашение, эти имена находятся в стандартном заголовочном файле (stdint.h) и конце с _t.

18
ответ дан mkClark 23 November 2019 в 03:19
поделиться

Эти _t по сути не имеет никакого особого значения. Но это попало в общее использование для добавления эти _t суффикс к определению типа.

можно быть более знакомы с общими методами C для переменного именования... Это подобно тому, как распространено засунуть p в передней стороне для указателя и использовать подчеркивание перед глобальными переменными (это немного менее распространено), и использовать имена переменной i, j, и k для временных переменных цикла.

В коде, где размер слова и упорядочивание важны, очень распространено использовать пользовательские определенные типы, которые являются явными, такой как BYTE WORD (обычно 16-разрядный) DWORD (32 бита).

int_t не так хорошо, потому что определение int варьируется между платформами - поэтому, чей int Вы соответствуете? (Хотя в эти дни большая часть центральной ПК разработки рассматривает его, как 32 бита, много материала для некомпьютерной разработки все еще рассматривает интервал как 16 битов).

11
ответ дан Trevor 23 November 2019 в 03:19
поделиться

Это - просто соглашение, что означает "тип". Это не означает ничего специального для компилятора.

10
ответ дан Matt Curtis 23 November 2019 в 03:19
поделиться

Это означает тип. size_t тип размера.

9
ответ дан RiaD 23 November 2019 в 03:19
поделиться

Было несколько хороших объяснений о предмете. Только добавить другую причину переопределения типов:

Во многих встроенных проектах, все типы переопределены, чтобы правильно указать данную калибровку типам и улучшить мобильность через различные платформы (т.е. компиляторы типов оборудования).

Другая причина будет состоять в том, чтобы сделать Ваш код портативным через различное OSs и избегать коллизий с существующими типами в ОС, которую Вы интегрируете в своем коде. Для этого обычно уникальное (как возможный) добавляется префикс.

Пример:

typedef unsigned long dc_uint32_t;
8
ответ дан Jamal 23 November 2019 в 03:19
поделиться

Если Вы имеете дело с кодом аппаратного интерфейса, автор кода, на который Вы смотрите, возможно, определил int_t, чтобы быть определенным целым числом размера. Стандарт C не присваивает определенный размер int тип (это зависит от Вашего компилятора и целевой платформы, потенциально), и использование определенного int_t, тип избежал бы той проблемы мобильности.

Это - особенно важное соображение для кода аппаратного интерфейса, который может быть, почему Вы сначала заметили соглашение там.

7
ответ дан Greg Hewgill 23 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: