Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Хорошо, то, в чем Вы нуждаетесь, classobj
от нового модуля. Это позволило бы Вам создавать классы исключений динамично (classobj
, берет строку в качестве аргумента в пользу имени класса).
import new
myexc=new.classobj("ExcName",(Exception,),{})
i=myexc("This is the exc msg!")
raise i
это дает Вам:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.ExcName: This is the exc msg!
помнят, что можно всегда передавать имя класса:
self.__class__.__name__
Так, после некоторого строкового искажения и конкатенации, необходимо смочь получить соответствующее имя класса исключений и создать объект класса с помощью того имени и затем повысить то исключение.
P.S. - можно также повысить строки, но это удерживается от использования.
raise(self.__class__.__name__+"Exception")
Почему бы не использовать SQLite? Существует хорошая поддержка в Python, и можно записать SQL-запросы для вывода данных. Вот документы Python для <час> sqlite3
, Если Вы не хотите использовать SQLite, Вы могли бы сделать массив dicts.
episodes = []
episodes.append({'season':1, 'episode': 2, 'name':'Something'})
episodes.append({'season':1, 'episode': 2, 'name':'Something', 'actors':['Billy Bob', 'Sean Penn']})
Тот способ, которым Вы добавляете метаданные к любой записи и ищете его очень легко
season_1 = [e for e in episodes if e['season'] == 1]
billy_bob = [e for e in episodes if 'actors' in e and 'Billy Bob' in e['actors']]
for episode in billy_bob:
print "Billy bob was in Season %s Episode %s" % (episode['season'], episode['episode'])
Я сделал что-то подобное в прошлом и использовал XML-документ в оперативной памяти в качестве быстрой и грязной hierachical базы данных для устройства хранения данных. Можно сохранить каждое шоу/сезон/эпизод как элемент (вложенный соответственно) и атрибуты этих вещей как атрибуты XML на элементах. Затем можно использовать XQuery для возвращения информации.
ПРИМЕЧАНИЕ: я не парень Python, таким образом, я не знаю то, на что похожа Ваша поддержка XML.
ПРИМЕЧАНИЕ 2: Вы захотите представить это, потому что это будет больше и медленнее, чем решение, которое Вы уже получили. Достаточно вероятно, если Вы делаете, некоторый большой объем, обрабатывающий затем XML, вероятно, не собирается быть Вашим другом.
Я не получаю эту часть здесь:
Это работало хорошо, но не было никакого простого способа проверить, как ли x [3] [24], предполагалось, существовал или не (таким образом, я не мог повысить season_not_found исключение)
существует способ сделать это - названный в :
>>>x={}
>>>x[1]={}
>>>x[1][2]={}
>>>x
{1: {2: {}}}
>>> 2 in x[1]
True
>>> 3 in x[1]
False
, что, кажется, проблема с этим?
Bartosz/To разъясняют, что "Это работало хорошо, но не было никакого простого способа проверить, как ли x [3] [24], предполагалось, существовал, или не"
x['some show'][3][24]
возвратил бы сезон 3, эпизод 24 "некоторого шоу". Если не было никакого сезона 3, я хочу, чтобы pseudo-dict повысил tvdb_seasonnotfound, если "некоторое шоу" не существует, то повысьте tvdb_shownotfound
существующая система серии классов, каждого с __getitem__
- Выставочные проверки if self.seasons.has_key(requested_season_number)
, Сезонные проверки класса if self.episodes.has_key(requested_episode_number)
и так далее.
Это работает, но это там, кажется, много повторного кода (каждый класс является в основном тем же, но повышает различную ошибку)