NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
У меня есть действительно глупый, но чрезвычайно полезный при навигации по глубоким древовидным структурам. Поместите это в .bashrc (или подобный):
alias cd6="cd ../../../../../.."
alias cd5="cd ../../../../.."
alias cd4="cd ../../../.."
alias cd3="cd ../../.."
alias cd2="cd ../.."
Хотите получить последние несколько строк файла журнала?
tail /var/log/syslog
Хотите следить за файлом журнала для того, когда он изменяется?
tail -f /var/log/syslog
Хотите быстро перечитать по файлу от запуска?
more /var/log/syslog
Хотите быстро найти, содержит ли файл некоторый текст?
grep "find this text" /var/log/syslog
Один из моих приемов избранного с ударом является "каналом tar". Когда у Вас есть чудовищное количество файлов для копирования от одного каталога до другого, делание "CP */an/other/dir" не работает, если количество файлов слишком высоко, и взорвите удар globber, таким образом, канал tar:
(cd /path/to/source/dir/ ; tar cf - * ) | (cd /path/to/destination/ ; tar xf - )
... и если у Вас есть netcat, Вы можете даже делать "netcat канал tar" через сеть!!
while IFS= read -r line; do
echo "$line"
done < somefile.txt
Это - хороший способ обработать файл линию за линией. Очистка IFS необходима для получения пробельных символов в передней стороне или конце строки. "-r" необходим для получения всех необработанных символов, включая обратные косые черты.
Я плохо знаком с программированием на Mac, и я пропускаю способность запустить gui программы от удара..., таким образом, я должен создать функции как это:
function macvim
{
/Applications/MacVim.app/Contents/MacOS/Vim "$@" -gp &
}
Лучшие 10 команд снова (как сообщение ctcherry, только короче):
history | awk '{ print $2 }' | sort | uniq -c |sort -rn | head
Хороший для того, чтобы сделать точную рекурсивную копию/резервное копирование каталога включая символьные ссылки (вместо того, чтобы следовать за ними или проигнорировать их как CP):
$ mkdir new_dir
$ cd old_dir
$ tar cf - . | ( cd ../old_dir; tar xf - )
Переменная среды FIGNORE хороша, когда Вы хотите, чтобы заполнение клавишей Tab проигнорировало файлы или папки с определенными суффиксами, например:
export FIGNORE="CVS:.svn:~"
Использование переменная среды IFS, когда Вы хотите определить разделитель объекта кроме пространства, например:
export IFS="
"
Это сделает Вас способными циклично выполниться через файлы и папки с пробелами в них, не выполняя волшебства, как это:
$ touch "with spaces" withoutspaces
$ for i in `ls *`; do echo $i; done
with
spaces
withoutspaces
$ IFS="
"
$ for i in `ls *`; do echo $i; done
with spaces
withoutspaces
Несколько лет назад я обнаружил p* команды, или получите информацию о процессах: B-дерево , pgrep, pkill, и pfiles. Конечно, родительский элемент их всех ps, но необходимо передать вывод по каналу в меньше , grep и/или awk для понимания вывода под большой нагрузкой. вершина (и варианты) помогают также.
Мне всегда нравился этот. Добавьте это к своему/etc/inputrc или ~/.inputrc
" \e [A": history-search-backward "\e [B": history-search-forward
, Когда Вы тип ls <up-arrow>
это будет заменено последней командой, запускающейся с "ls" или независимо от того, что Вы вставляете.
Чтобы быть в состоянии быстро отредактировать сценарий оболочки, Вы знаете, находится в Вашем $PATH (не пробуйте ls...):
function viscr { vi $(which $*); }
alias -- ddt='ls -trFld'
dt () { ddt --color "$@" | tail -n 30; }
Дает Вам новые файлы в текущем каталоге. Я использую все это время...
Если я ищу что-то в каталоге, но я не уверен в файле, то я просто grep файлы в каталоге:
find . -exec grep whatIWantToFind {} \;
Вы изменились на новый каталог, и хотят переместить файл от нового каталога до старого. В одном перемещении: mv file $OLDPWD
Некоторый полезный mencoder управляет, чтобы я узнал о при поиске некоторых инструментов редактирования аудио и редактирования видео:
от .xxx до Дампа .avi
mencoder movie.wmv -o movie.avi -ovc lavc -oac lavc
звучат от видео:
mplayer -ao pcm -vo null -vc dummy -dumpaudio -dumpfile fileout.mp3 filein.avi
Shell-fu - это место для хранения, проверки и распространения подсказок и приемов командной строки. Немного похоже на StackOverflow, но исключительно для оболочки. Там вы найдете множество ответов на этот вопрос.
Поскольку мне всегда нужен для i в $ (ls )
оператор, который я сделал сокращенным способом:
fea(){
if test -z ${2:0:1}; then action=echo; else action=$2; fi
for i in $(ls $1);
do $action $i ;
done;
}
Другой:
echo ${!B*}
Он распечатает список всех определенных переменных, которые начинаются с 'B'.
Программируемое завершение:
Ничего особенного. Я всегда отключаю его, когда использую Knoppix, потому что он слишком часто мешает. Только некоторые базовые:
shopt -s progcomp
complete -A stopped -P '%' bg
complete -A job -P '%' fg jobs disown wait
complete -A variable readonly export
complete -A variable -A function unset
complete -A setopt set
complete -A shopt shopt
complete -A helptopic help
complete -A alias alias unalias
complete -A binding bind
complete -A command type which \
killall pidof
complete -A builtin builtin
complete -A disabled enable
Перехват сигналов:
Вы можете перехватить сигналы, отправленные процессу оболочки, и заставить их выполнять команды в своей соответствующей среде, как если бы они были введены в командной строке:
# TERM or QUIT probably means the system is shutting down; make sure history is
# saved to $HISTFILE (does not do this by default)
trap 'logout' TERM QUIT
# save history when signalled by cron(1) script with USR1
trap 'history -a && history -n' USR1
Не совсем интерактивные уловки с оболочкой, но тем не менее можно использовать как уловки для написания хороших сценариев.
getopts, shift, $ OPTIND, $ OPTARG:
Мне нравится создавать настраиваемые сценарии:
while getopts 'vo:' flag; do
case "$flag" in
'v')
VERBOSE=1
;;
'o')
OUT="$OPTARG"
;;
esac
done
shift "$((OPTIND-1))"
xargs (1):
У меня трехъядерный процессор, и я люблю запускать сценарии, выполняющие сжатие, или некоторые другие последовательные операции с интенсивным использованием ЦП с набором файлов. Мне нравится ускорять его, используя xargs
в качестве очереди заданий.
if [ "$#" -gt 1 ]; then
# schedule using xargs
(for file; do
echo -n "$file"
echo -ne '\0'
done) |xargs -0 -n 1 -P "$NUM_JOBS" -- "$0"
else
# do the actual processing
fi
Это очень похоже на make -j [NUM_JOBS]
.
Быстрый текст
Я использую эти последовательности текста все слишком часто, поэтому я добавил к ним ярлыки .inputrc
:
# redirection short cuts
"\ew": "2>&1"
"\eq": "&>/dev/null &"
"\e\C-q": "2>/dev/null"
"\eg": "&>~/.garbage.out &"
"\e\C-g": "2>~/.garbage.out"
$if term=xterm
"\M-w": "2>&1"
"\M-q": "&>/dev/null &"
"\M-\C-q": "2>/dev/null"
"\M-g": "&>~/.garbage.out &"
"\M-\C-g": "2>~/.garbage.out"
$endif
Из чистого юмора создайте пустой файл «я», а затем: $ touchself
Я предпочитаю читать страницы справочника в vi, таким образом, у меня есть следующее в моем .profile или .bashrc файле
man () {
sought=$*
/usr/bin/man $sought | col -b | vim -R -c "set nonumber" -c "set syntax=man" -
}
alias mycommand = 'verylongcommand -with -a -lot -of -parameters'
alias grep='grep --color'
находят больше чем одно слово с grep:
netstat -c |grep 'msn\|skype\|icq'
Кстати история - использование загадочных каре, и т.д. не совсем интуитивно. Распечатать все объекты истории, содержащие данную строку:
function histgrep { fc -l -$((HISTSIZE-1)) | egrep "$@" ;}
find -iregex '.*\.py$\|.*\.xml Поиски шаблон во всех файлах Python и всех XML-файлах и каналах результат только для чтения в сессия Vim .
| xargs egrep -niH 'a.search.pattern' | vi -R -
Поиски шаблон во всех файлах Python и всех XML-файлах и каналах результат только для чтения в сессия Vim .
Я хочу упомянуть, как мы можем перенаправить главный вывод команды в файл с помощью его пакетного режима (-b)
-b-n 1 вершины $> top.out. $ (дата + %s)
По умолчанию, вершина вызывается с помощью интерактивного режима, в котором вершина работает неограниченно долго и принимает, что нажатие клавиши переопределяет, как вершина работает.
сообщение А, которое я записал, может быть найдено здесь
Мне нравится устанавливать подсказку, которая показывает текущий каталог в заголовке окна xterm. Это также показывает время и текущий каталог. Кроме того, если удар хочет сообщить, что фоновое задание закончилось, об этом сообщают в различном цвете с помощью escape-последовательностей ANSI. Я использую черную на свете консоль, таким образом, мои цвета не могут быть правильными для Вас при одобрении света-на-черном.
PROMPT_COMMAND='echo -e "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007\033[1;31m${PWD/#$HOME/~}\033[1;34m"'
PS1='\[\e[1;31m\]\t \$ \[\e[0m\]'
Удостоверяются, что Вы понимаете, как использовать \[
и \]
правильно в Вашей строке PS1 так, чтобы удар знал, сколько времени Ваша строка приглашения на самом деле представляет на экране. Это так, это может перерисовать Вашу командную строку правильно, когда Вы перемещаетесь вне однострочной команды.