Следующее отображается всем для каждого недопонимания.
1. Чрезмерное использование NULL
Избегать чрезмерного использования NULL - лучшая практика. Например, лучший подход состоит в том, чтобы метод вернулся к пустому массиву или сбору вместо нулевого значения, потому что это может помешать программе бросить NullPointerException. Следующий фрагмент кода получит коллекцию из другого метода:
List <string> accountids = person.getAccountids ();
Когда на рисунке нет учетной записи, getAccountids () вернет нулевое значение, и программа выбросит исключение NullPointerException. Следовательно, необходимо присоединиться к проверке воздуха, чтобы решить эту проблему. Если вы замените возвращенное нулевое значение на пустой список, то NullPointerException не появится. Более того, поскольку нам больше не нужно кратко проверять choundly -witd, код станет более кратким.
Если вы хотите избежать нулевых значений, разные сценарии могут принимать разные практики. Одним из методов является использование необязательного типа, который может быть как пустым объектом, так и пакетом некоторых значений.
Необязательно
На самом деле, Java8 обеспечивает более краткий путь:
Необязательно <string> optionalString = необязательный.
Java поддержала дополнительный тип из версии Java8, но он широко известен в мире функциональных программ. До этого он использовался в ранней версии Java в Google Guava.
2. Игнорируйте аномалии
Мы часто игнорируем аномалии. Тем не менее, лучшая практика состоит в том, чтобы иметь дело с ними для начинающих и опытных программистов Java. Ненормальное бросок обычно целенаправленно, поэтому в большинстве случаев необходимо записывать события, которые вызывают аномалии. Не недооценивайте этот вопрос. По крайней мере, чтобы дать другим разработчикам узнать причину и следствие, вы должны объяснить, почему эти нарушения не были рассмотрены.
Selfie = Person.shootaselfie ();
Простой способ подчеркнуть определенного неважного - использовать эту информацию в качестве аномального имени переменной, например, это:
Код кода копирования следующим образом:
try {selfie.delete ();} catch (nullpointterexception не знаком) {}
3. Модифицируйте аномалии одновременно
Эта аномалия возникает в объекте сбора, и в то же время не используется метод, предоставленный объектом итератора для обновления контента в коллекции. Например, здесь есть список шляп, и вы хотите удалить все значения, содержащие ушные закрылки:
Список <ihats = new Arraylist <> (); hasearflaps ()) {hats.remove (hat);}}
Если этот код запускается, будет выброшено concurrentModificationException, потому что код будет изменять его при прохождении этой коллекции. Когда несколько процессов действуют в одном и том же списке, когда один из процессов пересекает список, другой процесс пытается изменить содержание списка, и могут также возникнуть те же нарушения.
Он очень распространен в многочисленном содержимовом содержимое сбора параллельных модификаций, поэтому необходимо использовать метод, обычно используемый в одновременном программировании, таком как синхронные блокировки, специальные наборы для одновременной модификации и так далее. Java решает эту проблему в одной теме и многочисленной ситуации.
Соберите объекты и удалите их в другом цикле
Прямое решение состоит в том, чтобы положить шляпы с ушными клапанами в список, а затем удалить его другим циклом. Тем не менее, это требует дополнительного набора для хранения шляп, которые будут удалены.
Список <ihatstoremove = new LinkedList <> ();
Используйте метод итератор.
Этот метод проще, и в то же время не нужно создавать дополнительную коллекцию:
Итератор <ihatitrator = hats.iterator ();
Метод использования ListIterator
Когда внедрена коллекция интерфейса списка, итератор списка является очень подходящим выбором. Итератор, который реализует интерфейс Listitoror не только поддерживает операции удаления, но и поддерживает операции ADD и установление. Интерфейс Listotrator реализует интерфейс итератора, поэтому этот пример выглядит аналогично методу удаления итератора. Единственное отличие -тип итератора HAT, и мы получаем метод итератора, использующий метод ListOtrator (). Следующие фрагменты показывают, как использовать метод Sixterator.Remove и ListOtrator.Add, чтобы заменить шляпу для ушных шляп на SOM <Ombreros.
Ihat sombrero = new sombrero (); ;
Используя ListiceTerator, вызов удалить и добавить метод можно заменить, чтобы вызовать только один метод набора:
Ihat sombrero = new sombrero (); ); // Установить вместо удаления и добавления}}
Используйте метод потока в Java 8
В Java8 разработчики могут преобразовать коллекцию в потоку и поток фильтров в соответствии с некоторыми условиями. В этом примере рассказывается о том, как потоковые API фильтруют шляпы и избегают condurentModificationException. hats = hats.stream ().
Код кода копирования следующим образом:
.Collect (collectors.tocollection (ArrayList :: new));
Метод Collectors.tocollection создаст новый ArrayList, который отвечает за хранение значения отфильтрованных шляп. Если условия фильтрации отфильтровали большое количество записей, здесь будет сгенерировано большой массив. Поэтому вам нужно использовать его с осторожностью.
Используйте метод списка.
Вы можете использовать еще один более краткий и четкий метод в методе Java 8 -Removeif:
Код кода копирования следующим образом:
Hats.removeif (ihat :: hasearflaps);
Внизу, он использует итератор. Сделайте, чтобы завершить эту операцию.
Используйте специальную коллекцию
Если вы решите использовать CopeonWritearRayList вместо ArrayList в начале, проблем не будет. Поскольку CopyonWritearRaylist предоставляет модифицированные методы (такие как Set, добавить, удалить), он не изменит оригинальный массив сбора, но создает новую модифицированную версию. Это позволяет обезвреживать модифицировать исходную версию, так что CondurentModificationException не выброшено. Недостатки этой коллекции также очень очевидны -для каждой модификации генерируется новая коллекция.
Есть и другие наборы, подходящие для различных сценариев, таких как CopeonWriteset и concurrenthashmap.
Что касается другой ошибки, которая может возникнуть во время одновременных модификаций, он создает поток из коллекции. Общий критерий для потока состоит в том, чтобы избежать изменения коллекции Back -End при проверке потока. Следующий пример покажет, как правильно обрабатывать поток:
Список
Метод PEEK собирает все элементы и выполняет установленные действия для каждого элемента. Здесь действие состоит в том, чтобы попытаться удалить данные из основного списка, что, очевидно, неправильно. Чтобы избежать таких операций, вы можете попробовать некоторые методы, объясненные выше.
4. защита
Иногда, чтобы лучше сотрудничать, код, предоставленный стандартной библиотекой или третьей стороной, должен соответствовать общим зависимостям. Например, необходимо соблюдать совместное согласие между HashCode и равным, чтобы гарантировать, что серия классов сбора в рамках сбора Java и других классов с использованием методов HashCode и Equals может работать нормально. Не соблюдайте такие ошибки, как исключение или уничтожение компиляции кода;
Код ошибки может проникнуть в производственную среду, вызывая множество побочных эффектов. Это включает в себя плохой опыт пользовательского интерфейса, неправильные отчеты данных, плохую производительность приложения, потерю данных или больше. К счастью, эти катастрофические ошибки не часто встречаются. Ранее были упомянуты хешкод и равные, что сцена, по которой она появляется, может быть: коллекция зависит от цели для сравнения объектов или сравнения, точно так же, как Hashmap и Hashset. Проще говоря, есть два критерия для настоящего Соглашения:
Если два объекта равны, то хэш -код должен быть равным.
Если эти два объекта имеют одинаковый хэш -код, они могут быть равными или разными.
Первый критерий разрушения, когда вы пытаетесь извлечь данные из HashMap, это вызовет ошибки. Второй критерий означает, что объекты с одним и тем же хэш -кодом не обязательно равны.
Давайте посмотрим на последствия уничтожения первого критерия:
Public Static Class Boat {private String name; getClass ()! int hashcode () {return (int) (math.random () * 5000);}}
Как видите, класс лодки переписывает методы равных и хэшкодов. Тем не менее, он уничтожил соглашение, потому что HashCode вернул случайное значение для одного и того же объекта для каждого вызова. Следующий код, вероятно, не найдет лодку под названием «Энтерпрайз» в хэшсете, хотя на самом деле мы заранее добавили этот тип лодки:
Public Static void Main (String [] args) {set <ato Boats = new Hashset <> (); (Новая лодка ("Enterprise"));};}
Другое соглашение - это метод завершения. Вот ссылка на официальный документ Java по его функциональному описанию:
Обычное согласие завершения: когда виртуальная машина Javatm определяет, что любой поток больше не может получить доступ к указанному объекту, этот метод будет вызван. Метод завершения имеет несколько функций, включая использование этого объекта, чтобы быть доступным для других потоков; Например, метод завершения, который указывает на объект подключения ввода/вывода, может выполнить явную транзакцию ввода -вывода, чтобы прервать соединение перед постоянным выброшенным объектом.
Вы можете принять решение использовать метод завершения в процессоре файлов для выпуска ресурсов, но это использование плохое. Поскольку он называется во время переработки мусора, а время GC не уверено, время для завершения завершения не будет гарантировано.
5. Используйте исходный тип вместо параметризации
Согласно описанию документа Java: исходный тип либо непараметризован, либо нестатический член RM (также неинтересный интерфейс Pary или Parent). Перед введением джава общий тип не было примитивного альтернативного типа. Java поддерживает общее программирование из версии 1.5, и нет никаких сомнений в том, что это важное улучшение функции. Однако из -за обратной совместимости здесь есть ловушка, которая может уничтожить всю систему типа. Старайтесь примером:
ListOfNumbers = new ArrayList ();
Это список чисел, который определяется как оригинальный ArrayList. Поскольку он не указывает параметры типа, он может добавить в него любой объект. Тем не менее, последняя строка отображает элементы, которые он содержит для типа Int, и умноженная на 2, распечатала данные после удвоения данных в стандартном выходе.
Этот код не допустит ошибки во время компиляции, но как только он запустит, он принесет ошибку при запуске, потому что он пытается сопоставить тип символа с пластической хирургией. Очевидно, что если необходимая информация скрыта, система типов не поможет написать код безопасности.
Чтобы решить эту проблему, вам необходимо указать конкретный тип для объектов в коллекции:
Список <Integer> listofnumbers = new ArrayList <() ();
Единственная отличие от предыдущего кода - это строка, которая определяет коллекцию:
Код кода копирования следующим образом:
Список <Integer> listofnumbers = new ArrayList <();
Модифицированная компиляция кода не может быть передана, потому что он пытается добавить строку в коллекцию только ожидаемого пластика хранения. Компилятор отобразит сообщение об ошибке и укажет на строку, которая добавляет двадцать символов в список. Параметризация универсального типа - хорошая идея. В этом случае компилятор может проверить возможные типы, так что ненормальная вероятность выполнения из -за несоответствий была значительно снижена.
Основное краткое изложение вышеупомянутых пяти программистов Java часто совершает ошибки, я надеюсь, что каждый может понравиться.