Другое событие 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));
}
Я бы создал скрытое поле ввода и затем связал подпрограмму Javascript с событием onsubmit для формы. Эта процедура заполняет скрытое поле временем на клиентском компьютере.
Скрытое поле можно использовать с ASP.NET с помощью HTML-элемента управления «HtmlInputHidden». Вы просто предоставляете элемент управления вводом атрибут runat = "server", как и любой другой элемент управления на стороне сервера.
Сервер может затем прочитать это время, когда форма отправляет обратно. Вы можете даже обернуть это в элемент управления сервером, если вам нужно сделать это в нескольких местах.
В качестве альтернативы, вы можете сделать это с AJAX, но реализация будет зависеть от того, какую библиотеку вы используете.
Мне нравится идея использовать браузер / системное время и часовой пояс или позволить им выбрать свой часовой пояс. В прошлом проекте я использовал что-то вроде этого:
<script language="javascript">
function checkClientTimeZone()
{
// Set the client time zone
var dt = new Date();
SetCookieCrumb("ClientDateTime", dt.toString());
var tz = -dt.getTimezoneOffset();
SetCookieCrumb("ClientTimeZone", tz.toString());
// Expire in one year
dt.setYear(dt.getYear() + 1);
SetCookieCrumb("expires", dt.toUTCString());
}
// Attach to the document onload event
checkClientTimeZone();
</script>
А затем на сервере:
/// <summary>
/// Returns the client (if available in cookie) or server timezone.
/// </summary>
public static int GetTimeZoneOffset(HttpRequest Request)
{
// Default to the server time zone
TimeZone tz = TimeZone.CurrentTimeZone;
TimeSpan ts = tz.GetUtcOffset(DateTime.Now);
int result = (int) ts.TotalMinutes;
// Then check for client time zone (minutes) in a cookie
HttpCookie cookie = Request.Cookies["ClientTimeZone"];
if (cookie != null)
{
int clientTimeZone;
if (Int32.TryParse(cookie.Value, out clientTimeZone))
result = clientTimeZone;
}
return result;
}
Или вы можете передать его в качестве параметра URL и обработать его в Page_Load :
http://host/page.aspx?tz=-360
Просто не забывайте использовать минуты, поскольку не все часовые пояса являются целыми часами.
Если вы ведете профиль пользователя, вы можете попросить его указать часовой пояс, а затем выполнить необходимые расчеты.
Альтернативой является определение местоположения пользователя на основе его / ее IP-адреса. Или геолокации, если браузер имеет эту возможность (скоро для Firefox). Когда у вас есть местоположение пользователя, вы можете искать часовой пояс.
Решение javascript, вероятно, хорошее и простое.
Клиент и сервер могут быть не полностью синхронизированы, поэтому вопрос в том, хотите ли вы установить время на клиентском компьютере или на сервере, но с учетом различий в часовых поясах. Javascript может дать вам время на клиенте (включая часовой пояс). Вы также можете объединить время на сервере с часовым поясом клиента.
Вы никогда не сможете получить время с большей точностью, чем широта запроса.
Я использовал этот метод в ASP.Net с VB
Dim strLanguage As String = Request.UserLanguages(0)
Dim currentCulture As CultureInfo = CultureInfo.CreateSpecificCulture(strLanguage)
Dim dateformat As String = currentCulture.DateTimeFormat.ShortDatePattern
. Это даст формат времени данных компьютера, который просматривает данные.