Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
У Raymond Chen есть несколько идей:
https://devblogs.microsoft.com/oldnewthing/20050128-00/? p=36573
, Заключенный в кавычки здесь полностью, потому что архивы MSDN склонны быть несколько ненадежными:
простой способ состоит в том, чтобы использовать
%CD%
псевдопеременный. Это расширяется до текущего рабочего каталога.
set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
(Конечно, каталог, save/restore, возможно, более легко был сделан с
pushd
/popd
, но это не точка здесь.)Эти
%CD%
прием удобен даже из командной строки. Например, я часто оказываюсь в каталоге, где существует файл, на который я хочу воздействовать, но... о, мне нужно к chdir к некоторому другому каталогу для выполнения той операции.
set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args
(мне нравится использовать
%_%
в качестве моей переменной среды царапины.)Тип
SET /?
для наблюдения других псевдопеременных, обеспеченных командным процессором.
Также комментарии в статье определенно стоят просканировать, например, этого (с помощью Wayback Machine, так как комментариев не стало от более старых статей):
http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741
Это покрывает использование % ~dp0:
, Если Вы хотите знать, где пакетный файл живет:
%~dp0
%0
название пакетного файла.~dp
дает Вам диск и путь указанного аргумента.
Это эквивалентно пути сценария:
%~dp0
Это использует пакетный синтаксис расширения параметра. Параметр 0 всегда является самим сценарием.
, Если Ваш сценарий хранится в C:\example\script.bat
, то %~dp0
оценивает к C:\example\
.
ss64.com имеет больше информации о синтаксисе расширения параметра. Вот соответствующая выборка:
можно получить значение любого параметра с помощью %, сопровождаемого, он - числовая позиция по командной строке.
[...]
, Когда параметр используется для предоставления имени файла тогда, следующий расширенный синтаксис может быть применен:
[...]
% ~d1 Расширяются %1 до Буквы диска только - C:
[...]
% ~p1 Расширяется %1 до Пути только, например, \utils\, это включает запаздывание \, который может быть интерпретирован как символ ESC некоторыми командами.
[...]
модификаторы выше могут быть объединены:
% ~dp1 Разворачивает %1 до буквы диска и соединяет [только 1 119] каналом
[...]
, можно получить путь самого сценария пакетной обработки с %0, расширения параметра могут быть применены к этому так, % ~dp0 возвратит Диск и Путь к сценарию пакетной обработки, например, W:\scripts\
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d
pushd %curdir%