Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Я теперь сопоставил тестовые сценарии от Cal Henderson, Dave Child, Phil Haack, Doug Lovell и тестовых адресов RFC 3696. 164 во всем .
я запустил все эти тесты против всех блоков проверки допустимости, которые я мог найти. <забастовка> сравнение здесь: http://www.dominicsayers.com/isemail забастовка>
я попытаюсь усовершенствовать эту страницу, поскольку люди улучшают свои блоки проверки допустимости. Благодаря Cal, Dave и Phil для их справки и сотрудничества в компиляции этих тестов и конструктивной критики мой собственный блок проверки допустимости .
Люди должны знать эти опечатки против RFC 3696 в частности. Тремя из канонических примеров являются на самом деле недопустимые адреса. И максимальная длина адреса является 254 или 256 символами, не 320.
Примеры, допустимые согласно RFC2822
Примеры, недопустимые согласно RFC2822s
Доменная часть (после последнего), серия строковых маркировок, разделенных на точку.
Каждая маркировка является строкой 1 - 63 октетов, состоящих из A-Z, a-z 0-9 или дефиса (-)
Максимальный размер домена является 255 октетами.
Чтобы быть совместимой с arpanet, каждая маркировка должна начаться с буквы и закончиться буквой или цифрой, но некоторый TLD:s теперь позволяет весь числовой домен, как 0.nu
Обратите внимание, что TLD позволяют быть 63 октетами. Очень много документов на получение неправильно ограничивают его октетами 2-3, делающими domain.name недопустимый.
Пример?
abcdefghijklmnopqrstuvwxyz. ABCDEFGHIJKLMNOPQRSTUVWXYZ. % $!# и '+-/=.?^' {|} ~ @ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-0123456789.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z. A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.a-z. A-Z.0-9.a0.b1.c2.d3.e4.f5.g6.h7.i8.j9. K0. L1. M2. N3. O.domain.name
(и не, это не регистрируется),
Обновление: С IDNA почти все возможно:
См. также:
https://stackoverflow.com/questions/3232/how-far-should-one-take-e-mail-address-validation
http://www.leshazlewood.com/?p=5
Обновление: Bobince предложил протестировать на точку в доменном имени.
Сводка: Только тест для и точка в доменной части и затем отправляет электронное письмо с подтверждением.
Вот пример, которые тестируют на и точка:
Вот простой:
function isEmail(address) {
var pos = address.lastIndexOf("@");
return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}
Или функция, которая возвращает локальную и доменную часть в объекте (если Вы хотите обработать ее еще больше, например, преобразуйте ее в punycode),
function isEmail(address) {
var pos = address.lastIndexOf("@");
return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4) ?
{
local:address.substr(0,pos < 0 ? 0 : pos),
domain:address.substr(pos+1)
}: false;
}