Что предпочтительный Throwable должен использовать в частном служебном конструкторе класса?

Примечание: Преобразование в строковое преобразование

Это происходит просто, если вы пытаетесь рассматривать массив как строку:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Массив не может быть просто echo 'd или конкатенируется с строкой, потому что результат не определен. PHP будет использовать строку «Array» вместо массива и вызвать уведомление, чтобы указать, что это, вероятно, не то, что было предназначено, и что вы должны проверять свой код здесь. Вероятно, вы захотите что-то вроде этого:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Или зациклируйте массив:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

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

27
задан Rob Hruska 13 November 2011 в 15:00
поделиться

6 ответов

Существует утверждение: "Я утверждаю, что этого конструктора никогда не будут вызывать". Так, действительно, AssertionError корректно здесь.

31
ответ дан Chris Jester-Young 28 November 2019 в 05:06
поделиться

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

3
ответ дан Michael Borgwardt 28 November 2019 в 05:06
поделиться

Мне нравится включая комментарий Bloch:

// Suppress default constructor for noninstantiability

Или еще лучше помещение его по Ошибке:

private UtilityClass()
{
    throw new AssertionError("Suppress default constructor for noninstantiability");
}
11
ответ дан Craig P. Motlin 28 November 2019 в 05:06
поделиться

Что относительно IllegalAcessError?:)

2
ответ дан OscarRyz 28 November 2019 в 05:06
поделиться

Нет нет не, со всем должным уважением к Josh Bloch, никогда не бросают AssertionError, если это не от утверждения. , Если Вы хотите AssertionError здесь, бросьте его с assert(false). Тогда кто-то читающий код может найти его позже.

Еще лучше, определите свое собственное исключение, скажите CantInstantiateUtilityClass. тогда у Вас будет код, который говорит

try {
    // some stuff
} catch (CantInstantiateUtilityClass e) {
    // react
}

так, чтобы читатель ловца знал , что произошел.

Обновление

Время от времени некоторый проклятый дурак блуждает здесь и downvotes это снова, спустя почти четыре года после факта. Так, позвольте мне просто отметить, что стандарт все еще определяет AssertionError как результат неудавшегося утверждения, не как, что некоторый новичок думает , должен быть брошенным вместо четко определенного информативного исключения. К сожалению, хорошая дисциплина исключения является, возможно, наименее поощренным навыком в программировании Java.

3
ответ дан Charlie Martin 28 November 2019 в 05:06
поделиться

Поврежденное утверждение означает повреждение спецификации контракта кода. Таким образом, это - правильная вещь здесь.

Однако, поскольку я предполагаю частное инстанцирование экземпляра он также вызовет конструктора и вызовет ошибку - если у Вас не будет другого конструктора?

0
ответ дан Steve B. 28 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

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