Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int
:
int x;
x = 10;
В этом примере переменная x является int
, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.
Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:
Integer num;
num = new Integer(10);
Первая строка объявляет переменную с именем num
, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer
является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».
Во второй строке ключевое слово new
используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num
присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования .
(точка).
Exception
, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num
. Перед созданием объекта вы получите NullPointerException
. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.
Например, вы можете имеют следующий метод:
public void doSomething(SomeObject obj) {
//do something to obj
}
В этом случае вы не создаете объект obj
, скорее предполагая, что он был создан до вызова метода doSomething
. К сожалению, этот метод можно вызвать следующим образом:
doSomething(null);
В этом случае obj
имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException
, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.
Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething
может быть записано как:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}
Наконец, Как определить исключение & amp; причина использования Трассировки стека
Если ваша служба будет использоваться неопределенным числом пользователей, важно иметь в виду, что масштабируемость всегда будет проблемой, независимо от принятого варианта, вам нужно будет масштабировать службу для удовлетворения спроса, поэтому было бы удобно предположить, что ваша служба будет работать в группе автоматического масштабирования с пулом экземпляров EC2, а не одним экземпляром.
Что касается защиты URL-адреса, позволяющей загружать файлы только авторизованным пользователям, существует множество способов сделать это, не требуя, чтобы ваша служба выполняла роль промежуточного звена, тогда вам нужно будет решить как минимум две проблемы:
Предсказуемость имени файла : чтобы избежать предсказуемости URL, вы можете назвать загруженный файл как хэш и сохранить исходные имена файлов и владельцев в базе данных, такой как SimpleDB, при желании вы можете установить HTTP-заголовок, такой как «Content-Disposition: filename = original_file_name.ext», чтобы рекомендовать браузеру пользователей соответствующим образом назвать загруженный файл.
авторизация : когда пользователь запрашивает загрузку заданного файла вашей службой, выдайте временную авторизацию с помощью Query String Authentication или Временные учетные данные безопасности для этого конкретного пользователя, предоставляющего доступ на чтение к файлу в течение некоторого времени, ваша служба перенаправляет на URL-адрес корзины S3 для прямой загрузки. Это может значительно разгрузить ваши экземпляры пула EC2, делая их доступными для более быстрой обработки других запросов.
Чтобы уменьшить пространство и трафик в вашем контейнере S3 (помните, что вы платите за хранимый и переданный ГБ), я бы также рекомендовал сжимать каждый отдельный файл, используя стандартный алгоритм, такой как gzip, перед загрузкой в S3 и устанавливать заголовок " Content-Encoding: gzip ", чтобы автоматическая распаковка работала с браузером пользователей. Если вы выбираете язык программирования Java, я предлагаю взглянуть на код плагина webcache-s3-maven-plugin , который я создал для загрузки статических ресурсов из веб-проектов.
Что касается времени обработки при сжатии папки, вы часто не сможете обеспечить сжатие папок за короткое время, чтобы позволить пользователю загрузить его немедленно, поскольку в конечном итоге могут появиться огромные папки, Сжатие может занять минуты или даже часы. Для этого я предлагаю вам использовать службы SQS и SNS, чтобы разрешить обработку асинхронного сжатия , это будет работать следующим образом:
В этом сценарии у вас может быть две группы автоматического масштабирования, соответственно фронтенд и бэкэнд, которые могут иметь разные ограничения масштабируемости.