Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
-contains
работал на меня
$pathToCheck = "c:\some path\to\a\file.txt"
$env:Path - split ';' -contains $pathToCheck
Для добавления пути, когда он еще не существует, я использую
$pathToCheck = "c:\some path\to\a\file.txt"
if(!($env:Path -split ';' -contains $vboxPath)) {
$documentsDir = [Environment]::GetFolderPath("MyDocuments")
$profileFilePath = Join-Path $documentsDir "WindowsPowerShell/profile.ps1"
Out-File -FilePath $profileFilePath -Append -Force -Encoding ascii -InputObject "`$env:Path += `";$pathToCheck`""
Invoke-Expression -command $profileFilePath
}
Вы упоминаете, что не хотите добавлять каталог к пути поиска, если это уже существует там. Ваше намерение состоит в том, чтобы сохранить каталог постоянно к пути, или просто временно для пользы пакетного файла?
, Если Вы хотите добавить (или удалить) каталоги постоянно для СОЕДИНЕНИЯ КАНАЛОМ, смотрите на утилиту Path Manager (pathman.exe) в Windows Resource Kit Tools для задач администрирования, http://support.microsoft.com/kb/927229 . С этим можно добавить или удалить компоненты и системы и пользовательских путей, и она обработает аномалии, такие как дублирующиеся записи.
, Если бы необходимо изменить путь только временно для пакетного файла, я просто добавил бы дополнительный путь перед путем с риском небольшого хита производительности из-за дублирующейся записи в пути.
Основываясь на ответе rcar, необходимо удостовериться, что подстрока цели не найдена.
if a%X%==a%PATH% echo %X% is in PATH
echo %PATH% | find /c /i ";%X%"
if errorlevel 1 echo %X% is in PATH
echo %PATH% | find /c /i "%X%;"
if errorlevel 1 echo %X% is in PATH
Если Ваш вопрос был, "почему не делает этой cmd работы фрагмента сценария?" тогда ответ - то, что for /f
выполняет итерации по строкам. delims
строки разделения в поля, но Вы только получаете первое поле в %%P
. Нет никакого способа получить произвольное число полей с for /f
цикл.
Я взял Вашу реализацию с помощью для цикл и расширил его во что-то, что выполняет итерации через все элементы пути. Каждое повторение для цикла удаляет первый элемент пути (%p) от всего пути (сохраненный в %q и %r).
@echo off
SET MYPATHCOPY=%PATH%
:search
for /f "delims=; tokens=1,2*" %%p in ("%MYPATHCOPY%") do (
@echo %%~p
SET MYPATHCOPY=%%~q;%%~r
)
if "%MYPATHCOPY%"==";" goto done;
goto search;
:done
Демонстрационный вывод:
Z:\>path.bat
C:\Program Files\Microsoft DirectX SDK (November 2007)\Utilities\Bin\x86
c:\program files\imagemagick-6.3.4-q16
C:\WINDOWS\system32
C:\WINDOWS
C:\SFU\common\
c:\Program Files\Debugging Tools for Windows
C:\Program Files\Nmap
Используя for
и delims
, Вы не можете получить произвольное число полей (как [1 110], Adam указал также), таким образом, необходимо использовать метод цикличного выполнения вместо этого. Следующий командный сценарий перечислит каждый путь в PATH
переменная среды на отдельной строке:
@echo off
setlocal
if "%~1"=="" (
set PATHQ=%PATH%
) else (
set PATHQ=%~1 )
:WHILE
if "%PATHQ%"=="" goto WEND
for /F "delims=;" %%i in ("%PATHQ%") do echo %%i
for /F "delims=; tokens=1,*" %%i in ("%PATHQ%") do set PATHQ=%%j
goto WHILE
:WEND
Это моделирует классическое , в то время как †¦ двигаются конструкция, найденная на многих языках программирования. С этим на месте, можно использовать что-то как [1 111] findstr
, чтобы впоследствии отфильтровать и искать конкретный путь. Например, если Вы сохранили вышеупомянутый сценарий в файле, названном tidypath.cmd
тогда, вот то, как Вы могли передать по каналу к findstr
, ища пути в соответствии со стандартным каталогом программ (использующий нечувствительное к регистру соответствие):
> tidypath | findstr /i "%ProgramFiles%"
Я не выполнил ни в каком пакетном файле, программирующем некоторое время, но:
echo ;%PATH%; | find /C /I ";<string>;"
должен дать Вам 0, если строка не найдена и 1 или больше если это.
РЕДАКТИРОВАНИЕ: Добавленный нечувствительный к регистру флаг, благодаря Panos.
Другой способ проверить, есть ли что-то на пути, - это запустить какой-нибудь невинный исполняемый файл, который не потерпит неудачу, если он есть, и проверить результат. В качестве примера следующий фрагмент кода проверяет, находится ли maven в пути:
mvn --help > NUL 2> NUL
if errorlevel 1 goto mvnNotInPath
Поэтому я пытаюсь запустить mvn --help , игнорируя вывод (don на самом деле не хочу видеть справку, если там есть maven) (> NUL), а также не отображать сообщение об ошибке, если maven не был найден (2> NUL).