Сценарий: исключение IllegalArgumentException для действия Apache Spark в Azure HDInsight
В этой статье описываются действия по устранению неполадок и возможные способы исправления проблем, возникающих при использовании компонентов Apache Spark в кластерах Azure HDInsight.
Проблема
При попытке выполнить действие Spark в конвейере Фабрики данных Azure появляется следующее исключение:
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: wasbs://additional@xxx.blob.core.windows.net/spark-examples_2.11-2.1.0.jar, expected: wasbs://wasbsrepro-2017-11-07t00-59-42-722z@xxx.blob.core.windows.net
Причина
Задание Spark завершается ошибкой, если jar-файл приложения не находится в хранилище по умолчанию или первичном хранилище кластера Spark.
Это известная проблема с платформой Spark с открытым кодом, которая отслеживается здесь: Spark job fails if fs.defaultFS and application jar are different url (Задание Spark завершается ошибкой, если fs.defaultFS и JAR-файл приложения имеют разные URL-адреса).
Проблема была устранена в Spark 2.3.0.
Разрешение
Убедитесь, что JAR-файл приложения хранится в хранилище по умолчанию или основном хранилище для кластера HDInsight. В Фабрика данных Azure убедитесь, что связанная служба ADF указывает на контейнер ПО умолчанию HDInsight, а не вторичный контейнер.
Следующие шаги
Если вы не видите своего варианта проблемы или вам не удается ее устранить, дополнительные сведения можно получить, посетив один из следующих каналов.
- Получите ответы специалистов Azure на сайте поддержки сообщества пользователей Azure.
- Подпишитесь на @AzureSupport — официальный канал Microsoft Azure для улучшения качества взаимодействия с клиентами. Вступайте в сообщество Azure для получения нужных ресурсов: ответов, поддержки и советов экспертов.
- Если вам нужна дополнительная помощь, отправьте запрос в службу поддержки на портале Azure. Выберите Поддержка в строке меню или откройте центр Справка и поддержка. Дополнительные сведения см. в статье Создание запроса на поддержку Azure. Доступ к управлению подписками и поддержкой выставления счетов уже включен в вашу подписку Microsoft Azure, а техническая поддержка предоставляется в рамках одного из планов Службы поддержки Azure.
6 Java исключений, которые преследуют новичков


Время от времени я сталкиваюсь с разработчиками-новичками, которые застряли на понимании следующих простых исключений и мне приходиться все заново объяснять им. Скорей всего в подобной ситуации оказываются многие опытные Java разработчики, которые помогают новичкам справиться со следующими исключениями. Поэтому я решил написать эту статью и в будущем ссылаться на нее. Комментарии и добавления в список исключений приветствуются.
- NoClassDefFoundError : Это одно из тех исключений, которое сообщением Exception in thread “main“ NoClassDefFoundError часто приветствует новых разработчиков в мире Java программирования. Они пишут helloworld-программу, идут в командную строку и пишут “java“ — команду для выполнения и «БАМ»:-) Немного времени спустя новички поймут как исправить это исключение и увидят как выводиться их hello world. NoClassDefFoundError случается тогда, когда виртуальная машина Java (JVM) пытается получить доступ к классу во время исполнения и этот класс не находится, хотя тот же класс находился во время компиляции. Чаще всего это исключение случается при запуске Java программы через команду “java“ с неверным значением параметра classpath . [ Classpath – это параметр, который задается через командную строку или через переменную окружения, указывающий виртуальной Java машине или Java компилятору где искать классы или пакеты объявленные пользователем – прим. переводчика] Возможные причины исключения:
- Класс недоступен в Classpath .
- Часто скрипт, который исполняется при запуске операционной системы, изменяет значение переменной окружению classpath . Это можно проверить выполнив команду “ set ” в командной строке в Windows и посмотрев включено ли определение класса в значение classpath . При желании дальнейшее изучение этого исключения можно продолжить в блоге Javarevisited.
- ClassNotFoundException : Исключение ClassNotFoundException это еще одно исключение, из-за которого новичкам, только начинающим программировать на Java, снятся кошмары. Интересно что для среднего разработчика нужно некоторое время чтобы перестать путать ClassNotFoundException и NoClassDefFoundError между собой. И поэтому вопрос о разнице этих двух исключений остается одним из часто задаваемых на собеседовании на позицию junior Java разработчика.
ClassNotFoundException случается когда JVM пытается загрузить определенный класс и не обнаруживает такого же в classpath . Обычно новички сталкиваются с этим в коде, который подключается к базе данных используя JDBC библиотеку. Пытаясь загрузить драйвер с помощью следующего кода Class.forName( “JDBCdriver”) . Хороший материал по ClassNotFoundException можно найти здесь. Так же рекомендуется ознакомиться и понять концепцию загрузчиков классов в Java чтобы эффективно справляться с этим исключением. Вы возможно захотите посмотреть следующую страницу о том как настроить classpath в окружениях Win/Unix. А так, как следует из документации Java, это исключение случается в следующих случаях:- Когда пытаются загрузить класс используя метод Class.forName и файл .class не существует в classpath . Это самый частый случай из всех трех.
- Когда загрузчик класса пытается загрузить класс используя метод loadClass .
- Когда загрузчик класса пытается загрузить класс используя findSystemClass .
- NullPointerException : исключение NullPointerException понять легче и новички с ним справляются быстрее нежели с двумя предыдущими. В тоже время причину исключения очень легко найти так как приводится номер строки где оно случилось. В первую очередь исключение случается когда JVM пытается обратиться к null в том месте где должен был быть объект. Чаще всего это случается когда JVM пытается вызвать метод используя объект и оказывается что объект равен null . Другие случаи, как упоминается в документации Java, могут быть следующими:
- Получая доступ к или изменяя метод объекта, который равен null .
- Получая длину массива когда он равен null .
- Получая доступ к или меняя объекты, которые являются заключенными в массив, который равен null .
Самый простой способ избежать этого исключения это добавить проверку на неравенство null (далее – проверка на null – прим. переводчика). Поэтому рано или поздно разработчик начинает это использовать и тогда проверки на null появляются везде. Интересно что использовать везде проверку на null не считается примером хорошего программирования. Основная причина почему проверка на null используется разработчиками это передавать объект null в случаи ошибки. В место этого пример хорошего программирования, который должен пропагандироваться программистами, это передавать пустой объект когда условие для главной/рабочей ветви программы не удовлетворяется. Это в свою очередь уменьшило бы количество проверок на null . Все-таки легче говорить нежели применять это на практике.:)
Исправляем 7 распространенных ошибок обработки исключений в Java
Привет, Хабр! Представляю вашему вниманию перевод статьи Fixing 7 Common Java Exception Handling Mistakes автора Thorben Janssen.
Обработка исключения является одной из наиболее распространенных, но не обязательно одной из самых простых задач. Это все еще одна из часто обсуждаемых тем в опытных командах, и есть несколько передовых методов и распространенных ошибок, о которых вы должны знать.
Вот несколько вещей, которые следует избегать при обработке исключений в вашем приложении.
Ошибка 1: объявление java.lang.Exception или java.lang.Throwable
Как вы уже знаете, вам нужно либо объявить, либо обработать проверяемое исключение. Но проверяемые исключения — это не единственные, которые вы можете указать. Вы можете использовать любой подкласс java.lang.Throwable в предложении throws. Таким образом, вместо указания двух разных исключений, которые выбрасывает следующий фрагмент кода, вы можете просто использовать исключение java.lang.Exception в предложении throws.
public void doNotSpecifyException() throws Exception < doSomething(); >public void doSomething() throws NumberFormatException, IllegalArgumentException < // do something >Но это не значит, что вы должны это сделать. Указание Exeption или Throwable делает почти невозможным правильное обращение с ними при вызове вашего метода.Единственная информация, которую получает вызывающий вами метод, заключается в том, что что-то может пойти не так. Но вы не делитесь какой-либо информацией о каких-либо исключительных событиях, которые могут произойти. Вы скрываете эту информацию за обобщенными причинами выброса исключений.Становится еще хуже, когда ваше приложение меняется со временем. Выброс обобщенных исключений скрывает все изменения исключений, которые вызывающий должен ожидать и обрабатывать. Это может привести к нескольким непредвиденным ошибкам, которые необходимо найти в тестовом примере вместо ошибки компилятора.
Используйте конкретные классы
Гораздо лучше указать наиболее конкретные классы исключений, даже если вам приходится использовать несколько из них. Это сообщает вызывающему устройству, какие исключительные событий нужно обрабатывать. Это также позволяет вам обновить предложение throw, когда ваш метод выдает дополнительное исключение. Таким образом, ваши клиенты знают об изменениях и даже получают ошибку, если вы изменяете выбрасываемые исключения. Такое исключение намного проще найти и обработать, чем исключение, которое появляется только при запуске конкретного тестового примера.
public void specifySpecificExceptions() throws NumberFormatException, IllegalArgumentException
Ошибка 2: перехват обобщенных исключений
Серьезность этой ошибки зависит от того, какой программный компонент вы реализуете, и где вы обнаруживаете исключение. Возможно, было бы хорошо поймать java.lang.Exception в основном методе вашего приложения Java SE. Но вы должны предпочесть поймать определенные исключения, если вы реализуете библиотеку или работаете над более глубокими слоями вашего приложения.
Это дает несколько преимуществ. Такой подход позволяет обрабатывать каждый класс исключений по-разному и не позволяет вам перехватывать исключения, которых вы не ожидали.
Но имейте в виду, что первый блок catch, который обрабатывает класс исключения или один из его супер-классов, поймает его. Поэтому сначала обязательно поймайте наиболее специфический класс. В противном случае ваши IDE покажут сообщение об ошибке или предупреждении о недостижимом блоке кода.
try < doSomething(); >catch (NumberFormatException e) < // handle the NumberFormatException log.error(e); >catch (IllegalArgumentException e) < // handle the IllegalArgumentException log.error(e); >Ошибка 3: Логирование и проброс исключений
Это одна из самых популярных ошибок при обработке исключений Java. Может показаться логичным регистрировать исключение там, где оно было брошено, а затем пробросить его вызывающему объекту, который может реализовать конкретную обработку для конкретного случая использования. Но вы не должны делать это по трем причинам:
1. У вас недостаточно информации о прецеденте, который хочет реализовать вызывающий объект вашего метода. Исключение может быть частью ожидаемого поведения и обрабатываться клиентом. В этом случае нет необходимости регистрировать его. Это добавит ложное сообщение об ошибке в файл журнала, который должен быть отфильтрован вашей операционной группой.
2. Сообщение журнала не предоставляет никакой информации, которая еще не является частью самого исключения. Его трассировка и трассировка стека должны содержать всю необходимую информацию об исключительном событии. Сообщение описывает это, а трассировка стека содержит подробную информацию о классе, методе и строке, в которой она произошла.
3. Вы можете регистрировать одно и то же исключение несколько раз, когда вы регистрируете его в каждом блоке catch, который его ловит. Это испортит статистику в вашем инструменте мониторинга и затрудняет чтение файла журнала для ваших операций и команды разработчиков.
Регистрируйте исключение там, где вы его обрабатываете
Таким образом, лучше всего регистрировать исключение тогда, когда вы его обрабатываете. Как в следующем фрагменте кода. Метод doSomething генерирует исключение. Метод doMore просто указывает его, потому что у разработчика недостаточно информации для его обработки. Затем он обрабатывается в методе doEvenMore, который также записывает сообщение журнала.
public void doEvenMore() < try < doMore(); >catch (NumberFormatException e) < // handle the NumberFormatException >catch (IllegalArgumentException e) < // handle the IllegalArgumentException >> public void doMore() throws NumberFormatException, IllegalArgumentException < doSomething(); >public void doSomething() throws NumberFormatException, IllegalArgumentException < // do something >Ошибка 4: использование исключений для управления потоком
Использование исключений для управления потоком вашего приложения считается анти-шаблоном по двум основным причинам:
Они в основном работают как оператор Go To, потому что они отменяют выполнение блока кода и переходят к первому блоку catch, который обрабатывает исключение. Это делает код очень трудным для чтения.
Они не так эффективны, как общие структуры управления Java. Как видно из названия, вы должны использовать их только для исключительных событий, а JVM не оптимизирует их так же, как и другой код.Таким образом, лучше использовать правильные условия, чтобы разбить свои циклы или инструкции if-else, чтобы решить, какие блоки кода должны быть выполнены.
Ошибка 5: удалить причину возникновения исключения
Иногда вам может понадобиться обернуть одно исключение в другое. Возможно, ваша команда решила использовать специальное исключение для бизнеса с кодами ошибок и единой обработкой. Нет ничего плохого в этом подходе, если вы не устраните причину.
Когда вы создаете новое исключение, вы всегда должны устанавливать первоначальное исключение в качестве причины. В противном случае вы потеряете трассировку сообщения и стека, которые описывают исключительное событие, вызвавшее ваше исключение. Класс Exception и все его подклассы предоставляют несколько методов-конструкторов, которые принимают исходное исключение в качестве параметра и задают его как причину.
try < doSomething(); >catch (NumberFormatException e) < throw new MyBusinessException(e, ErrorCode.CONFIGURATION_ERROR); >catch (IllegalArgumentException e)
Ошибка 6: Обобщение исключений
Когда вы обобщаете исключение, вы ловите конкретный, например, NumberFormatException, и вместо этого генерируете неспецифическое java.lang.Exception. Это похоже, но даже хуже, чем первая ошибка, которую я описал в этой статье. Он не только скрывает информацию о конкретном случае ошибки на вашем API, но также затрудняет доступ.
public void doNotGeneralizeException() throws Exception < try < doSomething(); >catch (NumberFormatException e) < throw new Exception(e); >catch (IllegalArgumentException e) < throw new Exception(e); >>Как вы можете видеть в следующем фрагменте кода, даже если вы знаете, какие исключения может вызвать метод, вы не можете просто их поймать. Вам нужно поймать общий класс Exception и затем проверить тип его причины. Этот код не только громоздкий для реализации, но его также трудно читать. Становится еще хуже, если вы сочетаете этот подход с ошибкой 5. Это удаляет всю информацию об исключительном событии.
try < doNotGeneralizeException(); >catch (Exception e) < if (e.getCause() instanceof NumberFormatException) < log.error("NumberFormatException: " + e); >else if (e.getCause() instanceof IllegalArgumentException) < log.error("IllegalArgumentException: " + e); >else < log.error("Unexpected exception: " + e); >>Итак, какой подход лучший?
Будьте конкретны и сохраняйте причину возникновения исключения.
Исключения, которые вы бросаете, должны всегда быть максимально конкретными. И если вы оборачиваете исключение, вы также должны установить исходный исключение в качестве причины, чтобы не потерять трассировку стека и другую информацию, описывающую исключительное событие.
try < doSomething(); >catch (NumberFormatException e) < throw new MyBusinessException(e, ErrorCode.CONFIGURATION_ERROR); >catch (IllegalArgumentException e)
Ошибка 7: добавление ненужных преобразований исключений
Как я уже объяснял ранее, может быть полезно обернуть исключения в пользовательские, если вы установите исходное исключение в качестве причины. Но некоторые архитекторы переусердствуют и вводят специальный класс исключений для каждого архитектурного уровня. Таким образом, они улавливают исключение в уровне персистентности и переносят его в MyPersistenceException. Бизнес-уровень ловит и обертывает его в MyBusinessException, и это продолжается до тех пор, пока оно не достигнет уровня API или не будет обработано.
public void persistCustomer(Customer c) throws MyPersistenceException < // persist a Customer >public void manageCustomer(Customer c) throws MyBusinessException < // manage a Customer try < persistCustomer(c); >catch (MyPersistenceException e) < throw new MyBusinessException(e, e.getCode()); >> public void createCustomer(Customer c) throws MyApiException < // create a Customer try < manageCustomer(c); >catch (MyBusinessException e) < throw new MyApiException(e, e.getCode()); >>Легко видеть, что эти дополнительные классы исключений не дают никаких преимуществ. Они просто вводят дополнительные слои, которые оборачивают исключение. И хотя было бы забавно обернуть подарок во множестве красочной бумаги, это не очень хороший подход к разработке программного обеспечения.
Обязательно добавьте информацию
Просто подумайте о коде, который должен обрабатывать исключение или о самом себе, когда вам нужно найти проблему, вызвавшую исключение. Сначала вам нужно прорваться через несколько уровней исключений, чтобы найти исходную причину. И до сегодняшнего дня я никогда не видел приложение, которое использовало этот подход, и добавляло полезную информацию с каждым слоем исключения. Они либо обобщают сообщение об ошибке и код, либо предоставляют избыточную информацию.
Поэтому будьте осторожны с количеством настраиваемых классов исключений, которые вы вводите. Вы всегда должны спрашивать себя, дает ли новый класс исключений дополнительную информацию или другие преимущества. В большинстве случаев для достижения этого вам не требуется более одного уровня пользовательских исключений.
public void persistCustomer(Customer c) < // persist a Customer >public void manageCustomer(Customer c) throws MyBusinessException < // manage a Customer throw new MyBusinessException(e, e.getCode()); >public void createCustomer(Customer c) throws MyBusinessException < // create a Customer manageCustomer(c); >Кофе-брейк #220. Как исправлять исключения в Java — подробное руководство


Источник: JavaTechOnline Это руководство поможет вам научиться исправлять распространенные исключения в Java. Помимо теории, вы увидите примеры кода по исправлению таких проблем. Как и в других языках программирования, при написании кода Java-разработчики могут столкнуться с ошибками или исключениями. К исключениям следует относиться серьезно, поскольку их появление отнимает рабочее время. Однако, обладая некоторыми знаниями, вы можете ускорить решение большинства подобных проблем. Итак, давайте узнаем, как исправлять распространенные исключения в языке Java.
Общие рекомендации по предотвращению исключений в Java
- Всегда проверяйте ввод пользователя, прежде чем использовать его в своем коде.
- Используйте блоки try-catch , throws , throw , в зависимости от того, что подходит для конкретного сценария.
- Не пренебрегайте сообщениями в коде об обработках и наличии ошибок. Это поможет определить и исправить проблемы.
- Обязательно регистрируйте исключения в целях отладки. Вы можете использовать сообщения регистратора, чтобы помочь выявить проблемы.
- Следуйте рекомендациям по написанию кода, чтобы избежать исключений, и тщательно тестируйте свой код.
- Обновляйте свои зависимости API, чтобы убедиться, что вы используете самые последние и самые стабильные версии библиотек и фреймворков.
- Используйте необходимые инструменты и среды тестирования для выявления потенциальных проблем в коде до того, как они вызовут исключения.
- Отслеживайте производительность вашего приложения и журналы, чтобы быстро выявлять и устранять любые проблемы.
- Будьте в курсе передовых практик безопасности, чтобы убедиться, что ваш код безопасен и защищен от любых потенциальных атак.
- Тщательно документируйте свой код и его исключения, чтобы другим разработчикам было легче его понять и поддерживать.
Перечень наиболее распространенных исключений в Java
В Java существует достаточно длинный список исключений. Давайте рассмотрим некоторые из наиболее распространенных:
NullPointerException
NullPointerException (Исключение нулевого указателя) — это тип исключения RuntimeException . Оно возникает, когда мы пытаемся использовать ссылочную переменную, имеющую нулевое значение. Это означает, что она указывает на объект или переменную, чье значение равно null . Такая ошибка может произойти, если мы пытаемся вызвать метод или получить доступ к полю объекта, который не был инициализирован, или когда мы передаем null в качестве параметра методу, который его не обрабатывает. Чтобы предотвратить возникновение NullPointerException , можно проверить, является ли ссылочная переменная нулевой, используя оператор == . Если это так, тогда нужно правильно обработать нулевой случай. В качестве альтернативы мы можем инициализировать наши переменные значениями по умолчанию (где это возможно), чтобы гарантировать, что мы никогда не столкнемся с нулевой ссылкой. Другой способ избежать исключения NullPointerException — использование класса Optional . В Java Optional — это объект-контейнер, который может содержать или не содержать ненулевое значение. Он используется для представления наличия или отсутствия значения, аналогично тому, как нулевое значение используется для представления отсутствия значения. Если программист попытается получить доступ к пустому значению объекта Optional , программа не выдаст исключение NullPointerException , а вместо этого вернет пустой объект Optional . Другими словами, Optional заставляет программиста обрабатывать случай, когда значение отсутствует, что помогает избежать исключения NullPointerException .
IndexOutOfBoundsException
IndexOutOfBoundsException — это исключение среды выполнения, которое возникает, когда индекс, используемый для доступа к массиву или коллекции, имеет отрицательное значение или больше или равен размеру массива или коллекции. Чтобы предотвратить появление этого исключения, мы должны убедиться, что индекс, используемый для доступа к массиву или коллекции, находится в пределах его границ, то есть, он должен быть больше или равен нулю и меньше размера массива или коллекции.
ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException — это тип IndexOutOfBoundsException , возникающий при попытке доступа к массиву по недопустимому индексу. В Java индексы массива начинаются с 0 и заканчиваются на length()-1 , где length() — это количество элементов в массиве. Если вы попытаетесь получить доступ к элементу по индексу за пределами этого диапазона, Java выдаст исключение ArrayIndexOutOfBoundsException . При столкновении с ArrayIndexOutOfBoundsException вам следует просмотреть свой код, чтобы убедиться, что вы используете правильные индексы при доступе к элементам в массиве.
StringIndexOutOfBoundsException
StringIndexOutOfBoundsException — это тип IndexOutOfBoundsException , возникающий при попытке доступа к символу в строке с недопустимым индексом. Как и в случае с предыдущим исключением ArrayIndexOutOfBoundsException , помните, что в Java индекс строки начинается с 0 и заканчивается на length()-1 , где length() — это количество символов в строке. Если вы попытаетесь получить доступ к символу по индексу за пределами этого диапазона, вы можете столкнуться с исключением StringIndexOutOfBoundsException . Если вы столкнулись с StringIndexOutOfBoundsException , вам следует просмотреть свой код, чтобы убедиться, что вы используете правильные индексы при доступе к символам в строке.
ClassCastException
Это исключение возникает, когда мы пытаемся привести объект к типу, несовместимому с его фактическим типом. Чтобы решить подобную проблему, важно убедиться, что ваша Java-программа пытается привести объекты только к тем классам, экземплярами которых они являются. Вы можете проверить тип объекта с помощью оператора instanceof перед применением приведения.
IllegalArgumentException
IllegalArgumentException — это тип RuntimeException , который возникает, когда метод вызывается с недопустимым или неподходящим аргументом. Иными словами, такая ошибка может произойти, когда метод вызывается с аргументом, выходящим за пределы ожидаемого диапазона или не имеющим ожидаемого формата или структуры. Например, методу требуется положительное число в качестве аргумента, а мы предоставляем отрицательное число, что является недопустимым вводом. Если вы столкнулись с IllegalArgumentException , вам следует проверить свой код, чтобы убедиться, что вы вызываете методы с допустимыми и соответствующими аргументами.
IllegalStateException
IllegalStateException — это тип RuntimeException , который возникает, когда объект находится в неподходящем состоянии для выполняемой операции. Это может произойти, если метод вызывается для объекта, который не находится в ожидаемом состоянии. Например, если мы создадим объект подключения к базе данных, а затем закроем его. Тогда, если мы попытаемся создать объект Statement в закрытом соединении, это вызовет исключение IllegalStateException , потому что для метода createStatement() требуется открытое соединение. Если вы столкнулись с IllegalStateException , вам следует просмотреть свой код, чтобы убедиться, что вы вызываете методы для объектов, которые находятся в соответствующем состоянии.
UnsupportedOperationException
UnsupportedOperationException — это тип RuntimeException , возникающий при попытке выполнения неподдерживаемой операции над объектом. Эта ошибка может произойти, когда мы вызываем метод, который не реализован объектом или не поддерживается объектом. Чтобы предотвратить появление исключения, мы не должны вызывать такие операции, которые не поддерживаются на объектах. Нужно просмотреть наш код, чтобы убедиться, что мы вызываем методы для объектов, поддерживающих операцию.
ArithmeticException
ArithmeticException — это тип RuntimeException , возникающий, когда арифметическая операция дает недопустимый результат. Это исключение может возникнуть, когда мы пытаемся выполнить арифметическую операцию с неправильным или недопустимым аргументом. Например, при попытке деления на ноль. Чтобы решить эту проблему, мы можем выполнить проверку ввода и убедиться, что аргументы соответствуют требуемым условиям перед выполнением арифметической операции.
SecurityException
SecurityException — это тип RuntimeException , возникающий при нарушении безопасности во время выполнения программы. Эта ошибка может произойти, когда программа пытается выполнить операцию, не разрешенную политикой безопасности. Чтобы решить проблему, мы должны убедиться, что имеем доступ к ресурсам и выполняем операции, для которых у нас есть специальное разрешение.
NumberFormatException
NumberFormatException — это тип RuntimeException , который возникает, когда вызывается метод для преобразования строки в числовой формат, но строка не имеет соответствующего формата. Чтобы решить эту проблему, мы должны сначала проверить ввод пользователя, прежде чем пытаться его преобразовать. Также проверьте свой код, чтобы убедиться, что вы пытаетесь преобразовать строки, имеющие соответствующий формат для целевого числового типа.
InterruptedException
InterruptedException — это проверенное исключение, которое возникает, если поток ожидает, спит или блокируется для какого-либо события, и это событие прерывается другим потоком. Ошибка может произойти, когда поток ожидает ввода, освобождения блокировки или завершения какой-либо другой операции, а другой поток прерывает ожидающий поток. Чтобы решить эту проблему, вы можете перехватить InterruptedException и отреагировать, очистив ресурсы, остановив поток или предприняв другие соответствующие действия. Если вы столкнулись с InterruptedException , вам следует проверить свой код, чтобы убедиться, что вы правильно обрабатываете прерывания потока.
FileNotFoundException
FileNotFoundException — это проверенное исключение, которое возникает, когда программа пытается получить доступ к файлу, который не существует или не может быть найден в указанном месте. Оно может появиться, если файл написан с ошибкой, перемещен или удален, или даже когда программа не имеет необходимых разрешений для доступа к файлу. Чтобы исправить ошибку, вы можете выполнить проверку ввода и убедиться, что путь к файлу указан правильно, а программа имеет необходимые разрешения для доступа к файлу.
IOException
IOException — это проверенное исключение в Java, представляющее ошибку, возникшую при выполнении операций ввода или вывода, таких как чтение или запись в файл или сетевой сокет. Она может произойти по нескольким причинам, например, из-за отсутствия или недоступности указанного файла, сетевой ошибки или недостаточных разрешений. Чтобы исправить проблему, нужно выполнить несколько действий, таких как проверка сообщения об ошибке, обработка исключения с помощью try-catch , закрытие ресурсов, проверка разрешения на доступ к файлу и так далее.
NoSuchMethodException
NoSuchMethodException — это исключение, которое возникает во время выполнения, когда мы пытаемся вызвать метод, не существующий в классе. Такое исключение обычно возникает, если мы вызываем метод с помощью Class.getMethod() или Class.getDeclaredMethod() , а указанное имя метода не найдено в классе или интерфейсе. Исключение также может возникнуть, когда мы пытаемся вызвать метод с помощью класса java.lang.reflect.Method , а указанное имя метода не существует в объекте. Чтобы избежать такого исключения, убедитесь, вызываете допустимый метод с правильной сигнатурой метода и спецификатором доступа.
NoSuchFieldException
NoSuchFieldException — это исключение времени выполнения, которое возникает, когда мы пытаемся получить доступ к полю, которого нет в классе. Это исключение обычно возникает, когда мы вызываем метод с помощью Class.getField() или Class.getDeclaredField() , а указанное имя поля не найдено в классе или интерфейсе. Кроме того, оно также может быть вызвано, если мы пытаемся получить доступ к полю с помощью класса java.lang.reflect.Field , а указанное имя поля не существует в объекте. Чтобы избежать этого исключения, убедитесь, что вы обращаетесь к действительному полю с правильным именем и модификаторами доступа. Если вы обращаетесь к приватному полю, обязательно используйте метод getDeclaredField() вместо метода getField() .
IllegalAccessException
IllegalAccessException — это исключение времени выполнения, которое возникает, когда мы пытаемся получить доступ к полю или методу в классе, но у нас нет необходимых прав доступа. Это исключение обычно появляется, если мы пытаемся получить доступ к приватному полю или методу извне класса или когда мы пытаемся получить доступ к защищенному полю или методу из класса, который не является подклассом исходного класса. Также оно может быть вызвано при попытке получения доступа к полю или методу, который был помечен как недоступный с помощью класса java.lang.reflect.AccessibleObject . Чтобы избежать этой проблемы, убедитесь, что у вас есть необходимые права доступа к полю или методу, к которому вы пытаетесь получить доступ. Если поле или метод являются закрытыми, вам может потребоваться использовать отражение (reflection) и установить для AccessibleObject значение true (чтобы получить к нему доступ). Однако будьте осторожны при использовании отражения для доступа к закрытым полям или методам, так как это может нарушить инкапсуляцию и нарушить целостность класса.
VerifyError
VerifyError — это ошибка времени выполнения, которая является подклассом LinkageError . Она происходит, когда виртуальная машина Java (JVM) встречает файл класса, который нарушает определенные правила проверки. Когда класс Java компилируется, компилятор проверяет, соответствует ли байт-код определенным правилам и ограничениям, таким как безопасность типов и правильное использование стека и локальных переменных. Если файл класса нарушает эти правила, JVM выдаст VerifyError при загрузке и проверке класса во время выполнения. Чтобы избежать VerifyError , убедитесь, что ваш код соответствует правильному синтаксису и семантике языка Java. Если вы столкнулись с VerifyError , вы должны проверить свой код, чтобы убедиться, что он действителен и что отсутствуют нарушения правил проверки байт-кода Java.
OutOfMemoryError
OutOfMemoryError — это подкласс Error , тип Throwable , представляющий серьезные проблемы, которые невозможно устранить во время выполнения. Несмотря на то, что Java 8 включает в себя некоторые улучшения в сборке мусора и управлении памятью, вы по-прежнему можете столкнуться с OutOfMemoryError , если ваше приложение использует слишком много памяти или неправильно управляет использованием памяти. Чтобы избежать ошибки OutOfMemoryError , необходимо правильно управлять использованием памяти в приложении Java. Это предполагает использование структур данных и алгоритмов, которые эффективно используют память, избежание ненужного создания объектов и правильное удаление объектов, когда они больше не нужны. Кроме того, вы можете увеличить максимальный размер кучи для JVM, используя флаг -Xmx при запуске вашей Java-программы.
StackOverflowError
StackOverflowError — это тип ошибки, возникающий, когда размер стека, требуемый программой, превышает объем выделенной для нее памяти. Она может произойти, когда программа вызывает слишком много вложенных методов или когда метод слишком много раз рекурсивно вызывает сам себя, что приводит к бесконечному циклу. Виртуальная машина Java (JVM) выделяет фиксированный объем памяти для стека выполнения, который используется для отслеживания вызовов методов и локальных переменных. Когда стек переполняется, JVM выдает StackOverflowError . Чтобы избежать StackOverflowError , важно убедиться, что ваша Java-программа адекватно использует рекурсию и вызовы методов. Если вы столкнулись с ошибкой StackOverflowError , вы можете попробовать увеличить размер стека, используя флаг -Xss при запуске вашей Java-программы.
InvocationTargetException
InvocationTargetException — это проверенное исключение, которое генерируется механизмом отражения Java. Он входит в состав пакета java.lang.reflect.InvocationTargetException и используется для указания того, что во время вызова метода или конструктора возникло исключение. Когда метод или конструктор вызывается с использованием механизма отражения Java, вызывается метод invoke() класса java.lang.reflect.Method или java.lang.reflect.Constructor . Если вызываемый метод или конструктор выдает исключение, то метод invoke() перехватывает его и заключает в InvocationTargetException . Затем это исключение передается вызывающей стороне метода invoke() . Чтобы исправить InvocationTargetException , нам нужно перехватить его, получить исключение основной причины с помощью метода getCause() и соответствующим образом обработать исключение основной причины. Обратите внимание, что основной причиной может быть проверенное исключение или исключение времени выполнения, поэтому обязательно обработайте его правильно.
Способы исправления наиболее распространенных исключений в Java
Как исправить NullPointerException
Сценарий: у вас есть метод, который обращается к объекту, имеющему значение null .
String title= null; System.out.println(title.length()); // Это вызовет NullPointerExceptionРешение № 1: Перед использованием проверьте, является ли объект нулевым.
if(title!= null) < System.out.println(title.length()); >else
Решение № 2: Используйте Optional , чтобы избежать исключения NullPointerException .
Optional optionalTitle = Optional.ofNullable(getTitle()); if (optionalTitle.isPresent()) < String title= optionalTitle.get(); System.out.println("Title: " + title); >elseКак исправить ArrayIndexOutOfBoundsException
Сценарий: вы пытаетесь получить доступ к массиву с индексом, который находится за пределами его границ.
int[] numbers = ; System.out.println(numbers[3]); // Это вызовет ArrayIndexOutOfBoundsExceptionРешение: проверьте длину массива перед доступом к нему и убедитесь, что вы используете допустимые индексы.
int[] numbers = ; if (numbers.length > 3) < System.out.println(numbers[3]); >else
Как исправить ClassCastException
Сценарий: вы пытаетесь привести объект к типу, несовместимому с его фактическим типом.
Object obj = "Java Exception"; Integer number = (Integer) obj; // Это вызовет ClassCastExceptionРешение: Убедитесь, что вы приводите объекты только к тем типам, с которыми они совместимы.
Object obj = "Java Exception"; if(obj instanceof Integer) < Integer number = (Integer) obj; System.out.println(number); >else
Как исправить IllegalArgumentException
Сценарий: Вы передали недопустимый аргумент методу.
public void printNumber(int number) < if(number System.out.println(number); > printNumber(-1); // Это вызовет IllegalArgumentExceptionРешение: Убедитесь, что вы передаете допустимые аргументы методам. В этом случае передайте положительное число.
printNumber(1); // Это успешно напечатает 1.Как исправить IllegalStateException
Сценарий: объект находится в недопустимом состоянии.
public class Bike < private Boolean isStarted; public void start() < if(isStarted) < throw new IllegalStateException("Bike is already started"); >isStarted = true; System.out.println("Bike started"); > > Bike bike= new Bike(); bike.start(); bike.start(); // Это вызовет IllegalStateException потому что bike is already startedРешение: убедитесь, что вы правильно поддерживаете состояние объекта.
Bike bike= new Bike(); bike.start();Как исправить UnsupportedOperationException
Сценарий: Вы используете операцию, которая не поддерживается объектом. Один из популярных примеров: когда вы используете операцию remove() для неизменяемой коллекции, то вы наверняка увидите исключение UnsupportedOperationException .
List list = Arrays.asList("Java", "Angular", "Spring"); list.add("Python"); // Это вызовет UnsupportedOperationExceptionПоскольку метод Arrays.asList() возвращает неизменяемый список, он не поддерживает добавление или удаление элементов. Решение: Убедитесь, что вы вызываете только поддерживаемые операции над объектами.
List list = new ArrayList<>(Arrays.asList("Java", "Angular" "Spring")); list.add("Python"); System.out.println(list);Как исправить ArithmeticException
Сценарий № 1: Вы пытаетесь выполнить операцию целочисленного деления, которая дает дробный результат.
int i = 10; int j = 4; int k = i/j; // Это вызовет исключение ArithmeticException: целочисленное деление будет дробнымЗдесь результат операции деления равен 2,5, что является дробным значением. Поскольку целые числа не могут хранить дробные значения, возникает исключение ArithmeticException . Решение: Чтобы избежать этого исключения, мы можем использовать тип данных, поддерживающий дробные значения, например double , для хранения результата операции деления. Вот пример:
int i = 10; int j = 4; double k = (double) i/j;Сценарий № 2: Вы пытаетесь разделить на ноль, и у вас возникает это исключение. Это наиболее распространенный сценарий.
int i = 4; int j = 0; int k = i/j; // Это вызовет исключение ArithmeticException: нельзя делить на нольРешение: Правильно обрабатывать деление на ноль. Например, приведенный ниже код демонстрирует правильную обработку.
int i = 4; int j = 0; if(j != 0) < int k = i/j; System.out.println(k); >else
Как исправить IndexOutOfBoundsException
Сценарий: Вы пытаетесь получить доступ к коллекции с индексом, который находится за ее пределами.
List list = Arrays.asList("Apple", "Papaya", "Mango"); System.out.println(list.get(3)); // Это вызовет IndexOutOfBoundsExceptionРешение: проверьте размер коллекции перед доступом к ней и убедитесь, что вы используете допустимые индексы.
List list = Arrays.asList("Apple", "Papaya", "Mango"); if (list.size() > 3) < System.out.println(list.get(3)); >elseКак исправить IOException
Сценарий: операция ввода-вывода (input/output) завершается сбоем, так как файл недоступен.
try < File inputFile = new FileReader("pqr.txt"); BufferedReader reader = new BufferedReader(inputFile); String line = reader.readLine(); System.out.println(line); >catch (IOException e)Решение: Обработайте ошибки ввода-вывода и убедитесь, что ресурсы правильно закрыты.
File inputFile = new File("pqr.txt"); if (!inputFile.exists() || !inputFile.canRead()) < System.out.println("The input file is missing or not readable."); return; >try < BufferedReader reader = new BufferedReader(inputFile); String line = reader.readLine(); System.out.println(line); reader.close(); >catch (IOException e)Обратите внимание, что в качестве альтернативы мы можем использовать функцию try-with-resource , представленную в Java 7, для автоматического закрытия ресурсов, как показано ниже. Мы можем объявить один или несколько ресурсов в операторе try , и Java автоматически закроет ресурсы в конце блока, независимо от того, завершается ли блок нормально или возникает исключение.
try (BufferedReader reader = new BufferedReader(new FileReader("pqr.txt"))) < . >catchКак исправить FileNotFoundException
Сценарий: файл не найден в указанном месте.
try < BufferedReader reader = new BufferedReader(new FileReader("abc.txt")); String line = reader.readLine(); System.out.println(line); reader.close(); >catch (FileNotFoundException | IOException e)Решение: Убедитесь, что файл существует и у вас есть соответствующие разрешения для доступа к нему.
try < File file = new File("abc.txt"); if(!file.exists()) < throw new FileNotFoundException("File not found at the specified location"); >BufferedReader reader = new BufferedReader(new FileReader(file)); String line = reader.readLine(); System.out.println(line); reader.close(); > catch (IOException e)Как исправить NoSuchMethodException
Сценарий: если вы пытаетесь получить доступ к методу, который не может быть найден.
public class TestClass < public void sayHello() < System.out.println("Hello"); >> TestClass obj = new TestClass(); Method method = obj.getClass().getMethod("printHello"); // Это вызовет NoSuchMethodExceptionРешение: Убедитесь, что метод существует, а также правильность имени и подписи метода.
public class TestClass < public void sayHello() < System.out.println("Hello"); >> TestClass obj = new TestClass(); try < Method method = obj.getClass().getMethod("sayHello"); >catch (NoSuchMethodException e)Как исправить ConcurrentModificationException
Сценарий: коллекция изменяется во время ее повторения.
List list = new ArrayList<>(); list.add("Java"); list.add("Python"); for (String str : list) < list.remove(str); // Это вызовет ConcurrentModificationException >Решение: Используйте итератор для перебора коллекции и ее изменения с помощью методов итератора.
List list = new ArrayList<>(); list.add("Java"); list.add("Python"); Iterator iterator = list.iterator(); while (iterator.hasNext())