Это происходит просто, если вы пытаетесь рассматривать массив как строку:
$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
}
Если это уведомление появляется где-то, чего вы не ожидаете, это означает переменную, которую вы мысль - это строка, на самом деле это массив. Это означает, что у вас есть ошибка в коде, которая делает эту переменную массивом вместо ожидаемой строки.
Существует утверждение: "Я утверждаю, что этого конструктора никогда не будут вызывать". Так, действительно, AssertionError
корректно здесь.
UnsupportedOperationException походит на лучшее соответствие, хотя контролируемая исключительная ситуация была бы еще лучше, так как это могло бы предупредить кого-то ошибочно инстанцирование класса во время компиляции.
Мне нравится включая комментарий Bloch:
// Suppress default constructor for noninstantiability
Или еще лучше помещение его по Ошибке:
private UtilityClass()
{
throw new AssertionError("Suppress default constructor for noninstantiability");
}
Нет нет не, со всем должным уважением к Josh Bloch, никогда не бросают AssertionError
, если это не от утверждения. , Если Вы хотите AssertionError здесь, бросьте его с assert(false)
. Тогда кто-то читающий код может найти его позже.
Еще лучше, определите свое собственное исключение, скажите CantInstantiateUtilityClass
. тогда у Вас будет код, который говорит
try {
// some stuff
} catch (CantInstantiateUtilityClass e) {
// react
}
так, чтобы читатель ловца знал , что произошел.
Обновление
Время от времени некоторый проклятый дурак блуждает здесь и downvotes это снова, спустя почти четыре года после факта. Так, позвольте мне просто отметить, что стандарт все еще определяет AssertionError
как результат неудавшегося утверждения, не как, что некоторый новичок думает , должен быть брошенным вместо четко определенного информативного исключения. К сожалению, хорошая дисциплина исключения является, возможно, наименее поощренным навыком в программировании Java.
Поврежденное утверждение означает повреждение спецификации контракта кода. Таким образом, это - правильная вещь здесь.
Однако, поскольку я предполагаю частное инстанцирование экземпляра он также вызовет конструктора и вызовет ошибку - если у Вас не будет другого конструктора?