Из ответа @ gmmastros
Всякий раз, когда вы видите сообщение ....
string or binary data would be truncated
Подумайте о себе ... Поле НЕ достаточно большой для хранения моих данных.
Проверьте структуру таблицы для таблицы клиентов. Я думаю, вы обнаружите, что длина одного или нескольких полей НЕ достаточна для хранения данных, которые вы пытаетесь вставить. Например, если поле «Телефон» является полем varchar (8), и вы пытаетесь поместить в него 11 символов, вы получите эту ошибку.
Если вы посмотрите на декомпилированную версию файла класса
class X {
Y b;
X() {
b = new Y();
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y;
Z() {
y = new Y();
System.out.print("Z");
}
public static void main(String args[]) {
new Z();
}
}
Вы можете обнаружить, что переменная экземпляра y
перемещается внутри конструктора, поэтому последовательность выполнения выглядит следующим образом
Z
X
X
new Y()
. new Y()
Y
Все переменные экземпляра инициализируются с помощью инструкций конструктора.
Последовательность инициализации задана в JLS 12.5:
1. Сначала выделяется память для нового объекта
2. Затем все переменные экземпляра объекта (включая те, определенные в этом классе и всех его суперклассах) инициализируются значениями по умолчанию
. 3. Наконец, вызывается конструктор.
Когда вы вызываете конструктор, инициализаторы переменной экземпляра запускаются перед телом конструктора. Что вы думаете о выходе программы ниже?
public class Tester {
private Tester internalInstance = new Tester();
public Tester() throws Exception {
throw new Exception("Boom");
}
public static void main(String[] args) {
try {
Tester b = new Tester();
System.out.println("Eye-Opener!");
} catch (Exception ex) {
System.out.println("Exception catched");
}
}
}
Основной метод вызывает конструктор Tester, который выдает исключение. Вы могли бы ожидать, что предложение catch поймает это исключение и выведет Исключение, пойманное . Но если вы попытались запустить его, вы обнаружили, что он ничего не делает, и он выбрасывает StackOverflowError
.
Правильный порядок инициализации:
См. разделы § 2.17.5-6 спецификации виртуальной машины Java .
Чтобы прояснить неправильные представления со статикой, я просто обращусь к этой небольшой части кода:
public class Foo {
{ System.out.println("Instance Block 1"); }
static { System.out.println("Static Block 1"); }
public static final Foo FOO = new Foo();
{ System.out.println("Instance Block 2"); }
static { System.out.println("Static Block 2 (Weird!!)"); }
public Foo() { System.out.println("Constructor"); }
static public void main(String p[]) {
System.out.println("In Main");
new Foo();
}
}
Сюрприз заключается в том, что выход выглядит следующим образом:
Static Block 1
Instance Block 1
Instance Block 2
Constructor
Static Block 2 (Weird!!)
In Main
Instance Block 1
Instance Block 2
Constructor
Заметим, что у нас есть static {}
, который называется после двумя экземплярами {}
. это происходит потому, что мы вставляем конструктор в середине, вставляем порядок выполнения при первом вызове конструктора.
Обнаружено это, когда я работал над этим ответом - https://stackoverflow.com /a/30837385/744133.
В основном мы наблюдаем, что это произойдет:
Мне нужно исследовать, как сочетание наследования, а также явные и неявные вызовы super и это повлияет на это, и обновит результаты. Это было бы похоже на другие предоставленные ответы, за исключением того, что они ошибались со статической инициализацией.