Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Если это не проект с одним человеком, не делайте этого. Это получено, чтобы быть тривиальным к разности Ваши локальные файлы против Вашего репозитория исходного кода, и очищающийся пробел изменил бы строки, которые Вы не должны изменять. Я полностью понимаю; я люблю получать свой пробел вся универсальная форма †“, но это - что-то, что необходимо бросить ради более чистого сотрудничества.
Я использую (C++) ArtisticStyle , чтобы сделать это и также переформатировать мой код. Однако я должен был добавить это как внешний инструмент, и необходимо инициировать его сами, таким образом, Вам не мог бы понравиться он.
Однако я нахожу это превосходным, что я могу переформатировать код большим количеством пользовательского способа (например, многострочные параметры функции), что я могу заплатить цену выполнения его вручную. Инструмент является бесплатным.
Можно использовать макрос, любят описанный в пробел Удаления и перезапись комментариев, с помощью regex поиски
Прежде, чем сохранить Вас может использовать ярлык автоформата CTRL + K + D .
Можно создать макрос, который выполняется после сохранения, чтобы сделать это для Вас.
Добавьте следующее в Модуль EnvironmentEvents для Ваших макросов.
Private saved As Boolean = False
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
Handles DocumentEvents.DocumentSaved
If Not saved Then
Try
DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"\t", _
vsFindOptions.vsFindOptionsRegularExpression, _
" ", _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
' Remove all the trailing whitespaces.
DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
":Zs+$", _
vsFindOptions.vsFindOptionsRegularExpression, _
String.Empty, _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
saved = True
document.Save()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
End Try
Else
saved = False
End If
End Sub
Я использовал это в течение некоторого времени теперь без любых проблем. Я не создал макрос, но изменил его от того в ace_guidelines.vsmacros, который может быть найден с быстрым поиском Google.
Найдите/Замените Регулярные выражения использования
В диалоговом окне Находки и Замены, расширьтесь , Находят Опции , проверяют Использование , выбирают Regular expressions
Find What: ":Zs#$
"
Замена : ""
нажимают Replace All
In, другие редакторы ( нормальный синтаксический анализатор Регулярного выражения) ":Zs#$
" были бы" \s*$
".
Это действительно хороший пример того, как удалить завершающие пробелы. Есть несколько вещей, которые я бы изменил в зависимости от того, что я обнаружил с помощью этого макроса. Прежде всего, макрос автоматически преобразует табуляции в пробелы. Это не всегда желательно и может ухудшить положение людей, которые любят вкладки (обычно на базе Linux). В любом случае проблема табуляции не то же самое, что проблема лишних пробелов. Во-вторых, макрос предполагает, что одновременно сохраняется только один файл. Если вы сохраните несколько файлов одновременно, пробелы не удаляются правильно. Причина проста. Текущий документ считается документом, который вы можете видеть. В-третьих, он не проверяет результаты поиска на ошибки. Эти результаты могут помочь лучше понять, что делать дальше. Например, если пробелы не найдены и заменены, нет необходимости повторно сохранять файл. В целом мне не понравилась необходимость сохранения глобального флага или нет. Он имеет тенденцию просить о проблемах из-за неизвестных состояний. Я подозреваю, что этот флаг был добавлен исключительно для предотвращения бесконечного цикла.
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
Handles DocumentEvents.DocumentSaved
Dim result As vsFindResult
'Dim nameresult As String
Try
document.Activate()
' Remove all the trailing whitespaces.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
":Zs+$", _
vsFindOptions.vsFindOptionsRegularExpression, _
String.Empty, _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
'nameresult = document.Name & " " & Str$(result)
'MsgBox(nameresult, , "Filename and result")
If result = vsFindResult.vsFindResultReplaced Then
'MsgBox("Document Saved", MsgBoxStyle.OkOnly, "Saved Macro")
document.Save()
Else
'MsgBox("Document Not Saved", MsgBoxStyle.OkOnly, "Saved Macro")
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
End Try
End Sub
Я добавил окна отладочных сообщений, чтобы помочь увидеть, что происходит. Он очень ясно дал понять, что сохранение нескольких файлов не работает. Если вы хотите поиграть с ними, раскомментируйте эти строки.
Ключевое отличие заключается в использовании document.Activate () для принудительного вывода документа на передний план в активный текущий документ. Если результат 4, значит, текст был заменен. Ноль означает, что ничего не произошло. Вы увидите по два сохранения для каждого файла. Первый заменит, а второй ничего не сделает. Потенциально могут возникнуть проблемы, если сохранение не может записать файл, но, надеюсь, это событие не будет вызвано, если это произойдет.
До исходного сценария я не знал, как сценарий работал в Visual Studio. Немного удивительно, что он использует Visual Basic в качестве основного интерфейса, но он отлично справляется со своими задачами.
Я думаю, что версия Jeff Muir может быть немного улучшена, если она обрезает только файлы исходного кода (в моем случае C#, но легко добавить больше расширений). Также я добавил проверку видимости окна документа, потому что некоторые ситуации без этой проверки показывают мне странные ошибки (LINQ to SQL файлы '*.dbml', например).
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved
Dim result As vsFindResult
Try
If (document.ActiveWindow Is Nothing) Then
Return
End If
If (document.Name.ToLower().EndsWith(".cs")) Then
document.Activate()
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, ":Zs+$", vsFindOptions.vsFindOptionsRegularExpression, String.Empty, vsFindTarget.vsFindTargetCurrentDocument, , , vsFindResultsLocation.vsFindResultsNone)
If result = vsFindResult.vsFindResultReplaced Then
document.Save()
End If
End If
Catch ex As Exception
MsgBox(ex.Message & Chr(13) & "Document: " & document.FullName, MsgBoxStyle.OkOnly, "Trim White Space exception")
End Try
End Sub
Простым дополнением является удаление возврата каретки во время сохранения.
' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"\x000d\x000a", _
vsFindOptions.vsFindOptionsRegularExpression, _
"\x000a", _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
Ключ к этой работе - изменение \ x000d \ x000a на \ x000a. Префикс \ x указывает на шаблон Юникода. Это автоматизирует процесс подготовки исходных файлов для систем Linux.
Основываясь на ответе Dyaus и регулярном выражении из connect report, вот макрос, который обрабатывает сохранение всех, не заменяет табуляции пробелами и не требует статической переменной. Его возможный недостаток? Он кажется немного медленным, возможно, из-за многократных вызовов FindReplace
.
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
Handles DocumentEvents.DocumentSaved
Try
' Remove all the trailing whitespaces.
If vsFindResult.vsFindResultReplaced = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"{:b}+$", _
vsFindOptions.vsFindOptionsRegularExpression, _
String.Empty, _
vsFindTarget.vsFindTargetFiles, _
document.FullName, , _
vsFindResultsLocation.vsFindResultsNone) Then
document.Save()
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
End Try
End Sub
Для тех, кто еще пытается использовать это в дополнении Visual Studio 2012, регулярное выражение, которое я использовал, выглядит так: [ \t]+(?=\r?$)
(не забудьте убрать обратные слеши, если это необходимо). Я пришел сюда после нескольких тщетных попыток исправить проблемы с необработанным преобразованием {:b}+$
, не совместимым с возвратом каретки.