Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Существует два главного привыкнуть приблизительно к хранилищу данных Механизма Приложения когда по сравнению с 'традиционными' реляционными базами данных:
ключевая вещь понять - и причина позади обоих этих различий - состоит в том, что Bigtable в основном действует как огромный заказанный словарь. Таким образом помещенная операция просто устанавливает значение для данного ключа - независимо от любого предыдущего значения для того ключа, и операции выборки ограничены выборкой единственных ключей или непрерывных диапазонов ключей. Более сложные запросы сделаны возможными с индексами, которые являются в основном просто собственными таблицами, позволяя Вам реализовать более сложные запросы как сканирования на непрерывных диапазонах.
, Как только Вы поглотили это, Вам были нужны элементарные знания для понимания возможностей и ограничений хранилища данных. Ограничения, которые, возможно, казались произвольными, вероятно, имеют больше смысла.
ключевая вещь здесь состоит в том, что, хотя это ограничения по тому, что можно сделать в реляционной базе данных, эти те же ограничения - то, что делает ее практичной для увеличения масштаба к виду величины, которую Bigtable разработан для обработки. Вы просто не можете выполнить вид запроса, который выглядит хорошим на бумаге, но является ужасно медленным в базе данных SQL.
С точки зрения того, как измениться, как Вы представляете данные, самой важной вещью является предварительное вычисление. Вместо того, чтобы делать соединения во время запроса, предварительно вычислите данные и сохраните его в хранилище данных по мере возможности. Если Вы хотите выбрать случайную запись, генерировать случайное число и снабдить его каждой записью. <забастовка> Там является целой поваренной книгой подобных подсказок и обманывает здесь забастовка> Редактирование: поваренная книга больше не является существующей.
Путем я шел о переключателе ума, должен забыть о базе данных в целом.
В реляционном мире дб всегда необходимо волноваться о нормализации данных и структуре таблицы. Угробьте все это. Просто расположение Ваша веб-страница. Положите их всех. Теперь посмотрите на них. Вы уже 2/3 там.
, Если Вы забываете понятие, что вопросы размера базы данных и данные не должны быть дублированы тогда, Вы - 3/4 там, и Вы не должны были даже писать код! Позвольте своим представлениям продиктовать Ваши Модели. Вы не должны брать свои объекты и делать их 2 размерными больше как в реляционном мире. Можно хранить объекты с формой теперь.
Да, это - упрощенное объяснение испытания, но оно помогло мне забыть о базах данных и просто подать заявку. Я сделал 4 приложения для Механизма Приложения до сих пор с помощью этой философии и существует больше для прибытия.
Если Вы привыкли думать о ORM-отображенных объектах тогда, это в основном, как работает основанное на объекте хранилище данных как Механизм Приложения Google. Для чего-то как соединения можно посмотреть ссылочные свойства . Вы не должны действительно быть обеспокоены тем, использует ли это BigTable для бэкенда или чего-то еще, так как бэкенд абстрагирован API-интерфейсами Хранилища данных и GQL.
Будучи базированным в мире базы данных, хранилище данных мне было бы гигантской таблицей (отсюда имя "bigtable"). BigTable является плохим примером, хотя, потому что он делает много других вещей, которые типичная база данных не могла бы сделать, и все же это - все еще база данных. Возможности состоят в том, если Вы не знаете, что необходимо создать что-то как "bigtable" Google, Вы, вероятно, согласитесь со стандартной базой данных. Им нужно это, потому что они обрабатывают безумные объемы данных и системы вместе, и никакая коммерчески доступная система не может действительно сделать задание точным путем, они могут продемонстрировать, что им нужно задание, которое будет сделано.
(bigtable ссылка: http://en.wikipedia.org/wiki/BigTable )
Я всегда хихикаю, когда люди выпускают - это не является реляционным. Я записал cellectr в django, и вот отрывок моей модели ниже. Как Вы будете видеть, у меня есть лиги, которыми управляют или тренируют пользователи. Я могу от лиги получать всех менеджеров, или от данного пользователя я могу возвратить лигу, которую она тренирует или менеджеры.
Просто, потому что нет никакой определенной поддержки внешнего ключа, не означает, что у Вас не может быть модели базы данных с отношениями.
Мои два пенса.
class League(BaseModel):
name = db.StringProperty()
managers = db.ListProperty(db.Key) #all the users who can view/edit this league
coaches = db.ListProperty(db.Key) #all the users who are able to view this league
def get_managers(self):
# This returns the models themselves, not just the keys that are stored in teams
return UserPrefs.get(self.managers)
def get_coaches(self):
# This returns the models themselves, not just the keys that are stored in teams
return UserPrefs.get(self.coaches)
def __str__(self):
return self.name
# Need to delete all the associated games, teams and players
def delete(self):
for player in self.leagues_players:
player.delete()
for game in self.leagues_games:
game.delete()
for team in self.leagues_teams:
team.delete()
super(League, self).delete()
class UserPrefs(db.Model):
user = db.UserProperty()
league_ref = db.ReferenceProperty(reference_class=League,
collection_name='users') #league the users are managing
def __str__(self):
return self.user.nickname
# many-to-many relationship, a user can coach many leagues, a league can be
# coached by many users
@property
def managing(self):
return League.gql('WHERE managers = :1', self.key())
@property
def coaching(self):
return League.gql('WHERE coaches = :1', self.key())
# remove all references to me when I'm deleted
def delete(self):
for manager in self.managing:
manager.managers.remove(self.key())
manager.put()
for coach in self.managing:
coach.coaches.remove(self.key())
coaches.put()
super(UserPrefs, self).delete()