Хорошим местом для начала является 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 ).
(я - все еще поклонник PowerGREP, но я больше не использую его.)
я знаю, что Вы уже упомянули его, но PowerGREP потрясающий .
Некоторые мои любимые функции:
Теперь я понимаю, что другие grep инструменты могут сделать все вышеупомянутое. Это просто что пакеты PowerGREP вся функциональность в очень простой в использовании GUI.
От тех же замечательных людей, которые принесли Вам RegexBuddy и с кем у меня нет союза вне любви их материала. (Нужно отметить, что RegexBuddy включает базовую версию grep (для Windows) самого и это стоит намного меньше, чем PowerGREP.)
<час>Июль 2013 обновления:
Другой grep инструмент я теперь использую все время в Windows, AstroGrep:
Его способность показать мне больше, чем просто поиск строки (т.е. - context=NUM командной строки grep) неоценима.
И это быстро. Очень быстро, даже на старом компьютере с не - диск SSD (я знаю, они раньше делали этот жесткий диск с [1 113] вращение диски, названные диски , сумасшедшее право?)
Это свободно.
Это портативно (простой архив zip для разархивации).
Исходный октябрь 2008 ответа
гну Grep в порядке
, можно загрузить его, например, здесь: ( сайт ftp )
Весь обычные опции здесь.
, Что, объединенный с простофиля и xargs (включает, 'находят', от GnuWin32), и можно действительно написать сценарий как Вы, были на Unix!
Видят также эти опции, которые я использую для grep рекурсивно :
grep --include "*.xxx" -nRHI "my Text to grep" *
FINDSTR довольно мощен, поддерживает регулярные выражения и уже имеет преимущества того, чтобы быть на всех машинах Windows.
c:\> FindStr /?
Searches for strings in files.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
strings [[drive:][path]filename[ ...]]
/B Matches pattern if at the beginning of a line.
/E Matches pattern if at the end of a line.
/L Uses search strings literally.
/R Uses search strings as regular expressions.
/S Searches for matching files in the current directory and all
subdirectories.
/I Specifies that the search is not to be case-sensitive.
/X Prints lines that match exactly.
/V Prints only lines that do not contain a match.
/N Prints the line number before each line that matches.
/M Prints only the filename if a file contains a match.
/O Prints character offset before each matching line.
/P Skip files with non-printable characters.
/OFF[LINE] Do not skip files with offline attribute set.
/A:attr Specifies color attribute with two hex digits. See "color /?"
/F:file Reads file list from the specified file(/ stands for console).
/C:string Uses specified string as a literal search string.
/G:file Gets search strings from the specified file(/ stands for console).
/D:dir Search a semicolon delimited list of directories
strings Text to be searched for.
[drive:][path]filename
Specifies a file or files to search.
Use spaces to separate multiple search strings unless the argument is prefixed
with /C. For example, 'FINDSTR "hello there" x.y' searches for "hello" or
"there" in file x.y. 'FINDSTR /C:"hello there" x.y' searches for
"hello there" in file x.y.
Regular expression quick reference:
. Wildcard: any character
* Repeat: zero or more occurances of previous character or class
^ Line position: beginning of line
$ Line position: end of line
[class] Character class: any one character in set
[^class] Inverse class: any one character not in set
[x-y] Range: any characters within the specified range
\x Escape: literal use of metacharacter x
\<xyz Word position: beginning of word
xyz\> Word position: end of word
использование В качестве примера: findstr text_to_find *
или искать рекурсивно findstr /s text_to_find *
Избранная строка PowerShell подобна, это не те же опции и семантика, но это все еще мощно.
UnxUtils является тем, который я использую, работы отлично для меня...
Я успешно использовал утилиты GNU для Win32 в течение достаточно долгого времени, и он имеет хороший grep, а также хвост и другую удобную гну utils для win32. Я избегаю упакованной оболочки и просто использую исполняемые файлы прямо в win32 командной строке.
Хвост, который упаковывается, является вполне хорошим небольшим приложением также.
Ну, около порта Windows GNU grep в:
http://gnuwin32.sourceforge.net/
существует также grep Borland (очень похожий на GNU один) доступный в бесплатном программном обеспечении Бесплатный Компилятор C++ Borland (это - бесплатное программное обеспечение с инструментами командной строки).
Я всегда использую WinGREP, но у меня были проблемы с ним не отпускающий файлов.
ack работает хорошо над Windows (если Вы имеете Perl). Я нахожу его лучше, чем grep для многого использования.
Cygwin включает grep. Вся AMD инструментов GNU материал Unix работает отлично в Windows при установке Cygwin.
Это не может точно попасть в 'grep' категорию, но я не мог продвинуться в Windows без утилиты, названной AgentRansack. Это - находящееся в gui, "находят в файлах" утилиту с поддержкой regex. Это очень просто, чтобы щелкнуть правой кнопкой по папке, совершить нападки, "роются.." и найдите файлы, содержащие, что Вы ищете. Чрезвычайно быстро также.
Избранная Строка PowerShell cmdlet была прекрасна в v1.0, но значительно лучше для v2.0. Встраивание PowerShell к последним версиям Windows означает, что Ваши навыки здесь всегда будут полезный без первой установки чего-то.
Новые параметры, добавленные к Избранной Строке : Избранная Строка cmdlet теперь поддерживает новые параметры, такие как:
- - Контекст: Это позволяет Вам видеть строки прежде и после строки соответствия
- -AllMatches: который позволяет Вам видеть все соответствия в строке (Ранее, Вы видели только первое соответствие в строке)
- -NotMatch: Эквивалентный grep-v o
- - Кодирование: для определения кодировки символов
, я нахожу его целесообразным для создания функции gcir
для Get-ChildItem -Recurse .
с умом для передачи параметров правильно и псевдонима ss
для Select-String
. Так Вы запись:
gcir *.txt | ss нечто
Прошло уже несколько лет с тех пор, как вы задавали этот вопрос, но я бы рекомендовал AstroGrep (http://astrogrep.sourceforge.net).
Он бесплатный, с открытым исходным кодом и простым интерфейсом. Я постоянно использую его для поиска кода.