A StackOverflowError
- ошибка времени выполнения в java.
Он вызывается, когда количество памяти стека вызовов распределено JVM.
Обычный случай, когда a StackOverflowError
выбрасывается, когда стек вызовов превышает из-за чрезмерной глубокой или бесконечной рекурсии.
Пример:
public class Factorial {
public static int factorial(int n){
if(n == 1){
return 1;
}
else{
return n * factorial(n-1);
}
}
public static void main(String[] args){
System.out.println("Main method started");
int result = Factorial.factorial(-1);
System.out.println("Factorial ==>"+result);
System.out.println("Main method ended");
}
}
Трассировка стека:
Main method started
Exception in thread "main" java.lang.StackOverflowError
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
В приведенном выше случае можно избежать программных изменений. Но если логика программы правильная, и все же это происходит, тогда размер стека должен быть увеличен.
В нормализованной реляционной базе данных такая ситуация недопустима. У Вас должна быть объединяющая таблица, которая хранит одну строку для каждого отличного идентификатора объекта НЕЧТО и идентификатора Фруктов. Существование такой строки означает, что фрукт находится в том списке для НЕЧТО.
CREATE TABLE FOO (
id int primary key not null,
int1 int,
int2 int,
int3 int
)
CREATE TABLE Fruits (
id int primary key not null,
name varchar(30)
)
CREATE TABLE FOOFruits (
FruitID int references Fruits (ID),
FooID int references FOO(id),
constraint pk_FooFruits primary key (FruitID, FooID)
)
Для добавления фруктов Apple к списку определенного НЕЧТО возражают с ID=5, Вы были бы:
INSERT FOOFruits(FooID, FruitID)
SELECT 5, ID FROM Fruits WHERE name = 'Apple'
Если Вы совершенно уверены в том, что Вы делаете (т.е. Вы не должны будете искать значения списка, например), Вы могли также сериализировать свой объект, или просто объект списка, и сохранить его в столбце двоичных данных.
Просто разделение символа значения могут быть прекрасными также и более дешевые с точки зрения сохранения и загрузки, но быть осторожными, Ваши данные не содержат символ разделителя, или выходят из него (и обрабатывают Escape соответственно при загрузке и т.д... Ваш предпочтительный язык может сделать лучшее задание в этом, чем Вы, все же.;))
Однако для "надлежащего" решения, сделайте то, что Mehrdad описал выше.
Его технически возможный, но был бы очень плохой дизайн, imo.
Вы могли сделать это путем создания строки и хранения его в nvarchar (макс.) поле (при использовании SQL-сервера или его эквивалента).
Некоторые базы данных позволяют нескольким значениям быть сохраненными в отдельном столбце единственной строки, но обычно более удобно использовать отдельную таблицу.
Составляют таблицу с двумя столбцами, тот, который содержит указатели на первичный ключ таблицы объектов и тот, который содержит указатели на первичный ключ фруктовой таблицы. Затем если объект имеет три фруктов, существует три строки в object_fruit таблице что вся вся точка к тому же объекту, но к трем различным фруктам.
Вы можете, но это будет, вероятно, рассматривал как текст, делая ищущий в этом столбце трудный и медленный. Вы лучше из использования связанной таблицы.
INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID
FROM Fruits
WHERE name IN ('Apple', 'Orange');