Экранные практические советы для освоения системы GNU [закрываются]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть 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 = "";

Либо метод print, либо 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 ).

106
задан Glorfindel 10 July 2016 в 17:49
поделиться

17 ответов

Я использовал экран больше 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, чтобы попытаться разблокировать его.

91
ответ дан Flexo 24 November 2019 в 03:48
поделиться

Кто-то разместил аналогичный вопрос на Ошибка сервера .

2
ответ дан 3 July 2019 в 06:01
поделиться

^A переключатели назад на экран Вы просто произошли из.

0
ответ дан dummy 24 November 2019 в 03:48
поделиться

Мне нравится настраивать экранную сессию с описательными именами для окон. ^a A позволит Вам дать имя текущему окну, и ^a "даст Вам список Ваших окон. Когда сделано, отсоединение экран с ^a d и повторным прикреплением с экранным-R

2
ответ дан innaM 24 November 2019 в 03:48
поделиться

Существуют приблизительно интересная работа сделанный при получении хорошей установки экрана гну, происходящей по умолчанию в следующей версии Сервера Ubuntu, который включает использование нижней части экрана для показа всех окон, а также другие полезные детали машины (как # обновляет доступный и нужна ли машине перезагрузка). Можно, вероятно, захватить их .screenrc и настроить его к потребностям.

самые полезные команды я имею в моем .screenrc, следующий

shelltitle "$ |bash" # make screen assign window titles automatically
hardstatus alwayslastline "%w" # show all window titles at bottom line of term

Этот способ, которым я всегда знаю, какие окна открыты, и что работает в них в данный момент, также.

3
ответ дан David Dean 24 November 2019 в 03:48
поделиться

Едва ли важный не только связанный с экраном, но включение 256 раскрашивает мой терминал, Экран GNU и Vim улучшились, мой экран испытывают достижение (тем более, что я кодирую в Vim о 8-м день - существуют некоторые замечательные благоприятные для глаза системы цветов).

4
ответ дан muru 24 November 2019 в 03:48
поделиться

Ctrl + является основной командой

Ctrl + N =, переходят к *** N *** экран

расширения , Ctrl + P = переходят к *** P *** revious экран

, Ctrl + C = *** C *** повторно съел новый экран

Ctrl + D = *** D *** etach Ваш экран

6
ответ дан Hulk1991 24 November 2019 в 03:48
поделиться

ctrl + является специальным ключом.

ctrl + d - [d] etach, оставьте программы (irssi?) в фоне, пойти домой.

ctrl + c [c] повторно съел новое окно ctrl + 0-9 , переключатель между окнами номером

экранирует-r - возвращаются к отдельной сессии

, Который покрывает 90% вариантов использования. Не пытайтесь показать всю функциональность в единственное время.

6
ответ дан Hulk1991 24 November 2019 в 03:48
поделиться

http://www.debian-administration.org/articles/34

я записал, что несколько лет назад, но это - все еще хорошее введение, которое получает много позитивных откликов.

6
ответ дан 24 November 2019 в 03:48
поделиться

Я "должен" добавить это: добавьте

bind s

к Вашему .screenrc - как я - при используемый использовании окон с несколькими панелями поскольку C-a S разделяет фактическое окно, но C-a s замораживания это. Таким образом, я просто отключил ярлык замораживания.

6
ответ дан Zsolt Botykai 24 November 2019 в 03:48
поделиться

Если Ваш друг имеет привычку нажатие ^A для получения до начала строки в ударе, он находится в для некоторых неожиданностей, так как ^A экранная привязка командной клавиши. Обычно я заканчиваю с замороженным экраном, возможно из-за некоторой случайной клавиши, которую я нажал, после ^A:-)

В тех случаях я пробую

^A s, и ^A q блокируют/разблокируют терминал, прокручивающий

для фиксации этого. Для движения в начало строки в экранируют сочетание клавиш, ^A a

26
ответ дан agnul 24 November 2019 в 03:48
поделиться

Можно повторно отобразить клавишу выхода от 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

превосходный справочник может быть найден здесь . Стоящий установки закладки.

12
ответ дан Andrew Johnson 24 November 2019 в 03:48
поделиться

Ctrl + ? - показывают экран справки!

30
ответ дан Valery Viktorovsky 24 November 2019 в 03:48
поделиться

Я не мог привыкнуть для экранирования, пока я не нашел способ установить 'строку состояния' внизу экрана, которая показывает, какая 'вкладка' или 'виртуальный экран' Вы идете и который другие, там. Вот моя установка:

[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 ~]$
36
ответ дан Roel 24 November 2019 в 03:48
поделиться

Первая модификация, которую я внес в .screenrc, - это изменить команду escape. Как и многие из вас, мне не нравится последовательность Ctrl-A по умолчанию из-за того, что она мешает этой фундаментальной функции почти в любом другом контексте. В моем файле .screenrc я добавляю:

escape `e

Это обратная кавычка-e.

Это позволяет мне использовать обратную кавычку в качестве клавиши выхода (например, для создания нового экрана я нажимаю обратную кавычку-c , detach - обратная кавычка-d, обратная кавычка -? - помощь, обратная кавычка - предыдущий экран и т. д.). Единственный способ, которым это мешает (и мне пришлось избавиться от этой привычки), - это использовать обратную кавычку в командной строке для захвата результатов выполнения или вставлять все, что содержит обратную кавычку. Что касается первого, я изменил свою привычку, используя соглашение BASH $ (команда). Для последнего Обычно я просто открываю другой xterm или отключаюсь от экрана, а затем вставляю контент, содержащий обратную кавычку. Наконец, если я хочу вставить буквальную обратную кавычку, я просто нажимаю обратную кавычку-e.

3
ответ дан 24 November 2019 в 03:48
поделиться

Несколько советов для тех, кто вроде как знаком с экраном, но склонен не запоминать то, что читал на странице руководства:

  • Изменить имя окна экрана очень просто: ctrl + A shift + A .
  • Вы пропустили последнее сообщение с экрана? ctrl + a ctrl + m покажет его вам снова.
  • Если вы хотите что-то запустить (например, сохранить файл) и чтобы экран сообщал вам об изменениях, используйте ctrl + A shift + m в целевом окне. Предупреждение: он сообщит вам, если что-нибудь изменится.
  • Хотите выбрать окно 15 напрямую? Попробуйте это в своем файле .screenrc :
 bind! выберите 11
привязать @ выбрать 12
привязать \ # выбрать 13
привязать $ select 14
привязать% выбрать 15
привязать \ ^ выбрать 16
привязать и выбрать 17
привязать * выбрать 18
привязать (выберите 19
привязать) выберите 10

Это назначает ctrl + shift + от 0 до 9 для окон с 10 по 19.

8
ответ дан 24 November 2019 в 03:48
поделиться

Я не могу вспомнить, у кого я это украл (кто-то на 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

3
ответ дан 24 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: