Хорошим местом для начала является JavaDocs . Они охватывают это:
Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
- Вызов метода экземпляра нулевого объекта.
- Доступ или изменение поля нулевого объекта.
- Выполнение длины null, как если бы это был массив.
- Доступ или изменение слотов с нулевым значением, как если бы это был массив.
- Бросать нуль, как если бы это было значение Throwable.
Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.
blockquote>Также, если вы попытаетесь использовать нулевую ссылку с
synchronized
, который также выдаст это исключение, за JLS :SynchronizedStatement: synchronized ( Expression ) Block
blockquote>
- В противном случае, если значение выражения равно null,
NullPointerException
.Как это исправить?
Итак, у вас есть
NullPointerException
. Как вы это исправите? Возьмем простой пример, который выдаетNullPointerException
:public class Printer { private String name; public void setName(String name) { this.name = name; } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
Идентифицирует нулевые значения
. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:
Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19)
Здесь мы видим, что исключение выбрано в строке 13 (в методе
printString
). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, чтоs
имеет значение null, а вызов методаlength
на него вызывает исключение. Мы видим, что программа прекращает бросать исключение, когдаs.length()
удаляется из метода.Трассировка, где эти значения взяты из
Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что
s
передается сprintString(name)
в методеprint()
, аthis.name
- null.Трассировка, где эти значения должны быть установлены
Где установлен
this.name
? В методеsetName(String)
. С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. Этого достаточно, чтобы дать нам решение: добавить вызов
printer.setName()
перед вызовомprinter.print()
.Другие исправления
Переменная может иметь значение по умолчанию (и
setName
может помешать ему установить значение null):private String name = "";
Либо метод
printString
может проверить значение null например:printString((name == null) ? "" : name);
Или вы можете создать класс, чтобы
name
всегда имел ненулевое значение :public class Printer { private final String name; public Printer(String name) { this.name = Objects.requireNonNull(name); } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer("123"); printer.print(); } }
См. также:
Я все еще не могу найти проблему
Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).
Я использовал экран больше 10 лет и вероятно использую меньше чем половину функций. Таким образом, определенно не необходимо изучить все свои функции сразу же (и я не рекомендовал бы пробовать). Мои ежедневные команды:
^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback
я думаю вот именно. Я иногда использую функции разделения экрана, но конечно не ежедневно. Другая подсказка - то, если экран, кажется, заперся, потому что Вы поражаете некоторую комбинацию случайного ключа случайно, сделайте и ^Q и ^A ^Q, чтобы попытаться разблокировать его.
^A переключатели назад на экран Вы просто произошли из.
Мне нравится настраивать экранную сессию с описательными именами для окон. ^a A позволит Вам дать имя текущему окну, и ^a "даст Вам список Ваших окон. Когда сделано, отсоединение экран с ^a d и повторным прикреплением с экранным-R
Существуют приблизительно интересная работа сделанный при получении хорошей установки экрана гну, происходящей по умолчанию в следующей версии Сервера Ubuntu, который включает использование нижней части экрана для показа всех окон, а также другие полезные детали машины (как # обновляет доступный и нужна ли машине перезагрузка). Можно, вероятно, захватить их .screenrc
и настроить его к потребностям.
самые полезные команды я имею в моем .screenrc
, следующий
shelltitle "$ |bash" # make screen assign window titles automatically
hardstatus alwayslastline "%w" # show all window titles at bottom line of term
Этот способ, которым я всегда знаю, какие окна открыты, и что работает в них в данный момент, также.
Едва ли важный не только связанный с экраном, но включение 256 раскрашивает мой терминал, Экран GNU и Vim улучшились, мой экран испытывают достижение (тем более, что я кодирую в Vim о 8-м день - существуют некоторые замечательные благоприятные для глаза системы цветов).
Ctrl + является основной командой
Ctrl + N =, переходят к *** N *** экран
расширения , Ctrl + P = переходят к *** P *** revious экран
, Ctrl + C = *** C *** повторно съел новый экран
Ctrl + D = *** D *** etach Ваш экран
ctrl + является специальным ключом.
ctrl + d - [d] etach, оставьте программы (irssi?) в фоне, пойти домой.
ctrl + c [c] повторно съел новое окно ctrl + 0-9 , переключатель между окнами номером
экранирует-r - возвращаются к отдельной сессии
, Который покрывает 90% вариантов использования. Не пытайтесь показать всю функциональность в единственное время.
http://www.debian-administration.org/articles/34
я записал, что несколько лет назад, но это - все еще хорошее введение, которое получает много позитивных откликов.
Я "должен" добавить это: добавьте
bind s
к Вашему .screenrc
- как я - при используемый использовании окон с несколькими панелями поскольку C-a S
разделяет фактическое окно, но C-a s
замораживания это. Таким образом, я просто отключил ярлык замораживания.
Если Ваш друг имеет привычку нажатие ^A
для получения до начала строки в ударе, он находится в для некоторых неожиданностей, так как ^A
экранная привязка командной клавиши. Обычно я заканчиваю с замороженным экраном, возможно из-за некоторой случайной клавиши, которую я нажал, после ^A
:-)
В тех случаях я пробую
^A s
, и ^A q
блокируют/разблокируют терминал, прокручивающий
для фиксации этого. Для движения в начало строки в экранируют сочетание клавиш, ^A a
Можно повторно отобразить клавишу выхода от ctrl-A, чтобы быть другим ключом по Вашему выбору, поэтому при использовании его для чего-то еще, например, перейти к началу строки в ударе просто необходимо добавить строку к ~/.screenrc файл. Сделать его использование ^B или ^b:
escape ^bB
Из командной строки, используйте сессии имен для держания нескольких сессий под контролем. Я использую одну сессию на задачу, каждого с несколькими вкладками:
screen -ls lists your current screen sessions screen -S <name> creates a new screen session called name screen -r <name> connects to the named screen sessions
При использовании экрана Вам только нужны несколько команд:
^A c create a new shell ^A [0-9] switch shell ^A k kill the current shell ^A d disconnect from screen ^A ? show the help
превосходный справочник может быть найден здесь . Стоящий установки закладки.
Ctrl + ? - показывают экран справки!
Я не мог привыкнуть для экранирования, пока я не нашел способ установить 'строку состояния' внизу экрана, которая показывает, какая 'вкладка' или 'виртуальный экран' Вы идете и который другие, там. Вот моя установка:
[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"
backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[ %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"
sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$
Первая модификация, которую я внес в .screenrc, - это изменить команду escape. Как и многие из вас, мне не нравится последовательность Ctrl-A по умолчанию из-за того, что она мешает этой фундаментальной функции почти в любом другом контексте. В моем файле .screenrc я добавляю:
escape `e
Это обратная кавычка-e.
Это позволяет мне использовать обратную кавычку в качестве клавиши выхода (например, для создания нового экрана я нажимаю обратную кавычку-c , detach - обратная кавычка-d, обратная кавычка -? - помощь, обратная кавычка - предыдущий экран и т. д.). Единственный способ, которым это мешает (и мне пришлось избавиться от этой привычки), - это использовать обратную кавычку в командной строке для захвата результатов выполнения или вставлять все, что содержит обратную кавычку. Что касается первого, я изменил свою привычку, используя соглашение BASH $ (команда). Для последнего Обычно я просто открываю другой xterm или отключаюсь от экрана, а затем вставляю контент, содержащий обратную кавычку. Наконец, если я хочу вставить буквальную обратную кавычку, я просто нажимаю обратную кавычку-e.
Несколько советов для тех, кто вроде как знаком с экраном, но склонен не запоминать то, что читал на странице руководства:
.screenrc
: bind! выберите 11 привязать @ выбрать 12 привязать \ # выбрать 13 привязать $ select 14 привязать% выбрать 15 привязать \ ^ выбрать 16 привязать и выбрать 17 привязать * выбрать 18 привязать (выберите 19 привязать) выберите 10
Это назначает ctrl + shift + от 0 до 9 для окон с 10 по 19.
Я не могу вспомнить, у кого я это украл (кто-то на dotfile.org). Я немного изменил его для ssh:
#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command
wd=`pwd`
cmd=$1
shift
# We can tell if we are running inside screen by looking
# for the STY environment variable. If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.
if [ -z "$STY" ]; then
$cmd $*
else
# Screen needs to change directory so that
# relative file names are resolved correctly.
screen -X chdir $wd
# Ask screen to run the command
if [ $cmd == "ssh" ]; then
screen -X screen -t ""${1##*@}"" $cmd $*
else
screen -X screen -t "$cmd $*" $cmd $*
fi
fi
Затем я установил следующие псевдонимы bash:
vim() {
scr vim $*
}
man() {
scr man $*
}
info() {
scr info $*
}
watch() {
scr watch $*
}
ssh() {
scr ssh $*
}
Он открывает новый экран для вышеуказанных псевдонимов и, если используется ssh, он переименовывает заголовок экрана с именем хоста ssh.
Приветствую z0mbix