Съобщенията за грешки се извеждат във формат подобен на долу посочения:
java.sql.SQLException: Table already exists: SKLAD in statement [CREATE TABLE Sklad (DostawchikID INT, Wid VARCHAR(80), Pristignalo DATE, SluzitelID INT, Kolichestwo INT, Godnost DATE)]
at org.hsqldb.Trace.getError(Unknown Source)
at org.hsqldb.jdbcResultSet.
at org.hsqldb.jdbcConnection.executeStandalone(Unknown Source)
at org.hsqldb.jdbcConnection.execute(Unknown Source)
at org.hsqldb.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbcStatement.executeQuery(Unknown Source)
at HsqldbDemo.createDB(HsqldbDemo.java:35)
at HsqldbDemo.main(HsqldbDemo.java:96)
java.sql.SQLException: Violation of unique index: SYS_PK_DOSTAWCHICI in statement [INSERT INTO Dostawchici VALUES(1,'ЕТ “Петър Христов”')]
at org.hsqldb.Trace.getError(Unknown Source)
at org.hsqldb.jdbcResultSet.
at org.hsqldb.jdbcConnection.executeStandalone(Unknown Source)
at org.hsqldb.jdbcConnection.execute(Unknown Source)
at org.hsqldb.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbcStatement.executeQuery(Unknown Source)
at HsqldbDemo.fillDB(HsqldbDemo.java:80)
at HsqldbDemo.main(HsqldbDemo.java:97)
Това съобщение описва състоянието на програмния стек в момента, в който е възникнала грешката.
Набързо да обясним какво е програмният стек.
Програмите на Java имат общо взето следната структура:
На картинката е показана схематично една програма и няколко от нейните блокове. Показано е също така, от къде започва и къде свършва програмата. Виртуалната машина на Java се захваща с изпълнението на програмата от метода main. Както знаете това е конвенция. Ако няма main програмата не може да се изпълни. Не само, че не би свършила нищо, ами и ще има грешка при стартирането на Java.
Задача:
Каква ще е грешката?
При влизането във всеки един метод виртуалната машина отделя по един нов блок от паметта, необходим за изпълнението му, както и за съхраняване на локалните променливи.
Тези блокове от паметта не се организират безразборно, а на принципа на стека. Картинката по-долу показва ангажираните блокове при отделните точки от изпълнението на програмата.
Задача:
Как ще изглежда стекът като сме свършили изпълнението на Method3, преди да сме напуснали main?
Отляво е обозначено мястото в програмата, което е показано състоянието на стека, а отдясно- ангажираните блокове памет.
Блоковете не случайно са изобразени един върху друг. Стек (stack- англ.) означава купчина. Всеки нов блок може да се добавя само най-отгоре. За програмата е по-важно, че тя работи в най-горната област на стека.
При възникване на грешка на екрана се извежда списък с пълното състояние на стека в момента на грешката.
Ако трябва да преведем какво ни казва текста на екрана за грешки при показания в началото случай, то това би било:
Exception, наследник на java.sql.SQLException
Грешката гласи: Таблицата вече съществува (Table already exists): SKLAD про командата (in statement) [CREATE TABLE Sklad (DostawchikID INT, Wid VARCHAR(80), Pristignalo DATE, SluzitelID INT, Kolichestwo INT, Godnost DATE)].
Следва описание на мястото в програмата, където е възникнала грешката (описание на върха на стека):
| Клас | Метод | Ред |
|---|---|---|
| org.hsqldb.Trace | getError | Неизвестен ред |
| org.hsqldb.jdbcResultSet | В конструктора | Неизвестен ред |
| org.hsqldb.jdbcConnection | executeStandalone | Неизвестен ред |
| org.hsqldb.jdbcConnection | execute | Неизвестен ред |
| org.hsqldb.jdbcStatement | fetchResult | Неизвестен ред |
| org.hsqldb.jdbcStatement | executeQuery | Неизвестен ред |
| HsqldbDemo | createDB | HsqldbDemo.java ред 35 |
| HsqldbDemo | main | HsqldbDemo.java ред 96 |
| ..... | ..... | ..... |
Обикновено, за нас са най-важни първите редове на съобщението за грешка, и по точно първите редове от съобщението където е посочен файла, в който е грешката и номера на реда.
От този пример се вижда реда в който Java е изпълнявала командите: първо е стартиран методът main на главната програма (този път вървим отдолу нагоре). main е извикал createDB. createDB е извикал executeQuery и т.н. Ако не ни е ясно откъде се е взела тази грешка, добре е да започнем разнищването на проблема отгоре надолу. Първо можем да се хванем за ред 35 от HsqldbDemo.java. Всичко останало е станало някъде в драйвера на базата данни (класовете по-нагоре в стека не са написани от нас, нали ;-). На този ред виждаме, че се опитваме да изпълним заявка до базата данни за създаване на нова таблица. Понеже такава таблица при повторно изпълнение на програмата вече ще има, ние получаваме това съобщение.
Програмата върви добре, само дето ние се опитваме да я използваме неправилно. От тук нататък можем с помощта на мениджъра на базата данни да се убедим в това което сме направили и после да продължим със запълването на таблиците с информация.