Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа 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; причина использования Трассировки стека
Что-то вроде
cat /dev/urandom | base64
Что дает (много) таких вещей, как
hX6VYoTG6n+suzKhPl35rI+Bsef8FwVKDYlzEJ2i5HLKa38SLLrE9bW9jViSR1PJGsDmNOEgWu+6
HdYm9SsRDcvDlZAdMXAiHBmq6BZXnj0w87YbdMnB0e2fyUY6ZkiHw+A0oNWCnJLME9/6vJUGsnPL
TEw4YI0fX5ZUvItt0skSSmI5EhaZn09gWEBKRjXVoGCOWVlXbOURkOcbemhsF1pGsRE2WKiOSvsr
Xj/5swkAA5csea1TW5mQ1qe7GBls6QBYapkxEMmJxXvatxFWjHVT3lKV0YVR3SI2CxOBePUgWxiL
ZkQccl+PGBWmkD7vW62bu1Lkp8edf7R/E653pi+e4WjLkN2wKl1uBbRroFsT71NzNBalvR/ZkFaa
2I04koI49ijYuqNojN5PoutNAVijyJDA9xMn1Z5UTdUB7LNerWiU64fUl+cgCC1g+nU2IOH7MEbv
gT0Mr5V+XAeLJUJSkFmxqg75U+mnUkpFF2dJiWivjvnuFO+khdjbVYNMD11n4fCQvN9AywzH23uo
03iOY1uv27ENeBfieFxiRwFfEkPDgTyIL3W6zgL0MEvxetk5kc0EJTlhvin7PwD/BtosN2dlfPvw
cjTKbdf43fru+WnFknH4cQq1LzN/foZqp+4FmoLjCvda21+Ckediz5mOhl0Gzuof8AuDFvReF5OU
Или, без (бесполезного) cat + pipe:
base64 /dev/urandom
(тот же вид выхода ^^)
EDIT: вы также можете использовать опцию --wrap
для base64
, чтобы избежать «коротких линий» ":
base64 --wrap=0 /dev/urandom
Это приведет к удалению обертывания, и вы получите полноэкранный дисплей ^^
Уже есть несколько хороших ответов на то, как base64 кодирует случайные данные (т. е. cat /dev/urandom | base64
). Однако в теле вашего вопроса вы уточните:
... закодировать [urandom] в командной строке таким образом, чтобы весь его вывод был читаемым символом, например base64 или uuencode .
blockquote>Учитывая, что на самом деле вам не нужен синтаксический анализ base64 и просто хочу, чтобы он был доступен для чтения, я бы предложил
cat /dev/urandom | tr -dC '[:graph:]'
base64
выводить только буквенно-цифровые символов и двух символов (+ и / по умолчанию).[:graph:]
будет соответствовать любому печатаемому без пробелов ascii, включая много символов / знаков препинания, которых недостает base64. Поэтому, используяtr -dC '[:graph:]'
, вы получите более случайный вывод и получите лучшую эффективность ввода / вывода.Я часто использую
< /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32
для генерации надежных паролей.
tr -dC '[:graph:]' </dev/urandom
– RubyTuesdayDONO
23 January 2016 в 15:21
Ряд людей предложили cat
ting и piping через base64
или uuencode
. Одна из проблем заключается в том, что вы не можете контролировать, сколько данных читать (это будет продолжаться вечно, или пока вы не нажмете ctrl + c). Другая возможность - использовать команду dd
, которая позволит вам указать, сколько данных нужно прочитать перед выходом. Например, для чтения 1kb:
dd if=/dev/urandom bs=1k count=1 2>/dev/null | base64
Другой вариант заключается в том, чтобы передать команду strings
, которая может дать больше разнообразия в ее выходе (непечатаемые символы отбрасываются, любые прогоны менее 4 печатных отображаются символы [по умолчанию]). Проблема с strings
заключается в том, что она отображает каждый «запуск» в своей собственной строке.
dd if=/dev/urandom bs=1k count=1 2>/dev/null | strings
(конечно, вы можете заменить всю команду на
strings /dev/urandom
, если вы не хотите, чтобы он когда-либо останавливался).
Если вы хотите что-то действительно напуганное, попробуйте один из:
cat -v /dev/urandom
dd if=/dev/urandom bs=1k count=1 2>/dev/null | cat -v
head -c 100
, например, будет печатать первые 100 байт файла.
– Mark Rushakoff
9 August 2009 в 01:55
strings /dev/urandom | perl -pe 's/\n//'
– mivk
7 November 2013 в 02:22
Итак, что случилось с
cat /dev/urandom | uuencode -
?
Исправлено после первой попытки на самом деле не работало ... :: sigh ::
BTW. Многие утилиты unix используют «-» вместо имени файла, чтобы означать «использовать стандартный ввод».
cat
- сделайте это вместо этого: uuencode /dev/random -
– Dennis Williamson
3 December 2009 в 06:09
Вы можете делать более интересные вещи с помощью FIFO-каналов BASH:
uuencode <(head -c 200 /dev/urandom | base64 | gzip)
base64 --wrap=0 /dev/urandom |head -c 100
вы получите 100 случайных символов base64. Если вы ищете экранную заставку, основанную на bash, , это было сделано до :-) – Adam Katz 28 May 2015 в 00:01