Исключение, создаваемое статическим инициализатором, может указывать на проблему проектирования. На самом деле вы не должны пытаться загрузить файлы в статику. Кроме того, static не должен быть изменчивым.
Например, работая с JUnit 3.8.1, вы могли почти использовать его из апплета / WebStart, но это не удалось из-за одного статического инициализатора, осуществляющего доступ к файлу. Остальная часть задействованного класса отлично подходила для контекста, просто этот кусочек статики не соответствовал контексту и разрушал всю структуру.
В некоторых законных случаях возникает исключение. Если это тот случай, когда среда не имеет конкретной функции, скажем, потому что это старый JDK, то вы можете заменить реализации, и в этом нет ничего необычного. Если класс на самом деле не работает, создайте непроверенное исключение, а не разрешайте существование сломанного класса.
В зависимости от ваших предпочтений и имеющейся проблемы, есть два распространенных способа обойти это: явный статический инициализатор и статический метод. (Я, и я думаю, что большинство людей предпочитают первое; я считаю, что Джош Блох предпочитает второе.)
private static final Thing thing;
static {
try {
thing = new Thing();
} catch (CheckedThingException exc) {
throw new Error(exc);
}
}
Или
private static final Thing thing = newThing();
private static Thing newThing() {
try {
return new Thing();
} catch (CheckedThingException exc) {
throw new Error(exc);
}
}
Примечание: статика должна быть окончательной (и в целом неизменный). Будучи окончательным, правильное одиночное назначение проверяется вашим дружественным компилятором. Определенное присваивание означает, что оно может отловить прерванную обработку исключений - переносить и выбрасывать, не печатать / регистрировать. Как ни странно, вы не можете использовать имя класса, чтобы квалифицировать инициализацию с именем класса в статическом инициализаторе (я уверен, что для этого есть веская причина).
Инициализаторы экземпляров похожи, хотя вы можете заставить конструктор бросить или вы можете поместить инициализатор в конструктор.
Я думаю, это сработает:
dt {
float: left;
clear: left;
margin: 0;
padding: 0 .5em 0 0;
}
dd {
margin: 0;
padding: 0;
}
Другой полезный вариант - это псевдокласс : after
. Вы можете пропустить двоеточие в каждом из элементов dt
и иметь:
dt:after {
content: ":";
}
Это делает его более гибким, и вы можете изменить этот символ во всем списке и на веб-сайте в целом или избавиться от него, если вы казалось, что это похоже.
Чтобы решить проблему упаковки, о которой вы упомянули, вам необходимо установить ширину для элементов dt
и dd
. Или используйте таблицу с th
для имени / адреса и т. Д. И td
для «данных».
Вы можете просто поместить dd слева от предыдущего элемента, вот так.
dt { clear: left; }
dd { float: left; }
Вы также можете добавить атрибут ширины к любому из них для дополнительного выравнивания.
dt { clear: left; width: 20%; }
dd { float: left; }
Ну, вы можете просто позволить dt float: left
dt { float: left; }
или позволить dt отображать строку:
dt { display: inline; }
Вам необходимо удалить левое поле по умолчанию из dd.
dt {float:left;clear:left;margin-right:5px;}
dd {margin:0;}
Я думаю, что (раскомментируйте первую строку для проверки на малую ширину):
dl, dd, dt { margin: 0; }
/*dl { width: 80px; }*/
dl dt, dl dd { display: inline; }
dl dd:after { content: ' '; padding-left: 100%; }