Другое событие 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));
}
Не мог запрос в Вашем комментарии просто быть записанным как:
SELECT u1.name as UserName from Message m1, User u1
WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3
, Который должен также помочь с известными проблемами скорости с подзапросами в MySQL
Это, кажется, известная проблема.
http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html
http://bugs.mysql.com/bug.php?id=16757
Многие В запросах могут быть переписаны как (оставил внешним), соединения и (НЕ) ПУСТОЙ какой-то. например
SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)
может быть переписан, как
SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID
или
SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)
может быть
SELECT FOO.* FROM FOO
LEFT OUTER JOIN FOO2
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL
У меня была такая же проблема. Я хотел создать представление для отображения информации за последний год из таблицы с записями с 2009 по 2011 год. Вот исходный запрос:
SELECT a.*
FROM a
JOIN (
SELECT a.alias, MAX(a.year) as max_year
FROM a
GROUP BY a.alias
) b
ON a.alias=b.alias and a.year=b.max_year
Схема решения:
Вот запрос решения:
CREATE VIEW v_max_year AS
SELECT alias, MAX(year) as max_year
FROM a
GROUP BY a.alias;
CREATE VIEW v_latest_info AS
SELECT a.*
FROM a
JOIN v_max_year b
ON a.alias=b.alias and a.year=b.max_year;
Он отлично работает на mysql 5.0.45, без особого ущерба для скорости (по сравнению с выполнением оригинального подзапроса select без каких-либо представлений).