Bazaprogram.ru

Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java lang nosuchmethodexception

Встроенные исключения в Java с примерами

Встроенные исключения — это исключения, доступные в библиотеках Java. Эти исключения подходят для объяснения определенных ошибок. Ниже приведен список важных встроенных исключений в Java.
Примеры встроенных исключений:

    Арифметическое исключение: оно генерируется, когда в арифметической операции возникло исключительное условие.

// Java-программа для демонстрации
// ArithmeticException

public static void main(String args[])

int a = 30 , b = 0 ;

int c = a / b; // нельзя делить на ноль

System.out.println( «Result = » + c);

catch (ArithmeticException e) <

System.out.println( «Can’t divide a number by 0» );

Выход:

ArrayIndexOutOfBounds Исключение: выдается для указания на доступ к массиву с недопустимым индексом. Индекс либо отрицательный, либо больше или равен размеру массива.

// Java-программа для демонстрации
// ArrayIndexOutOfBoundException

public static void main(String args[])

int a[] = new int [ 5 ];

a[ 6 ] = 9 ; // доступ к 7-му элементу в массиве

catch (ArrayIndexOutOfBoundsException e) <

System.out.println( «Array Index is Out Of Bounds» );

Выход:

ClassNotFoundException: это исключение возникает, когда мы пытаемся получить доступ к классу, определение которого не найдено.

// Java-программа для иллюстрации
// концепция ClassNotFoundException

public static void main(String[] args)

Object o = class .forName(args[ 0 ]).newInstance();

System.out.println( «Class created for» + o.getClass().getName());

Выход:

FileNotFoundException: это исключение возникает, когда файл недоступен или не открывается.

// Java-программа для демонстрации
// FileNotFoundException

public static void main(String args[])

// Следующий файл не существует

File file = new File( «E:// file.txt» );

FileReader fr = new FileReader(file);

catch (FileNotFoundException e) <

System.out.println( «File does not exist» );

Выход:

IOException: это бросается, когда операция ввода-вывода потерпела неудачу или прервалась

// Java-программа для иллюстрации IOException

public static void main(String args[])

FileInputStream f = null ;

f = new FileInputStream( «abc.txt» );

while ((i = f.read()) != — 1 ) <

System.out.print(( char )i);

Выход:

InterruptedException: он генерируется, когда поток ожидает, спит или выполняет некоторую обработку, и прерывается.

// Java-программа для иллюстрации
// InterruptedException

public static void main(String args[])

Thread t = new Thread();

Выход:

NoSuchMethodException: t выбрасывается при доступе к методу, который не найден.

// Java-программа для иллюстрации
// NoSuchMethodException

i = Class.forName( «java.lang.String» );

catch (SecurityException e) <

catch (NoSuchMethodException e) <

catch (ClassNotFoundException e) <

public static void main(String[] args)

Выход:

NullPointerException: это исключение возникает при обращении к членам нулевого объекта. Null ничего не представляет

// Java-программа для демонстрации NullPointerException

public static void main(String args[])

String a = null ; // нулевое значение

catch (NullPointerException e) <

Выход:

NumberFormatException: это исключение возникает, когда метод не может преобразовать строку в числовой формат.

// Java-программа для демонстрации
// NumberFormatException

public static void main(String args[])

int num = Integer.parseInt( «akki» );

catch (NumberFormatException e) <

System.out.println( «Number format exception» );

Выход:

StringIndexOutOfBoundsException: он вызывается методами класса String, чтобы указать, что индекс либо отрицателен, чем размер строки.

// Java-программа для демонстрации
// StringIndexOutOfBoundsException

public static void main(String args[])

String a = «This is like chipping » ; // длина 22

char c = a.charAt( 24 ); // доступ к 25-му элементу

catch (StringIndexOutOfBoundsException e) <

Выход:

Некоторые другие важные исключения

    ClassCastException

// Java-программа для иллюстрации
// ClassCastException

public static void main(String[] args)

String s = new String( «Geeks» );

Object o = (Object)s;

Object o1 = new Object();

String s1 = (String)o1;

StackOverflowError

// Java-программа для иллюстрации
// StackOverflowError

public static void main(String[] args)

public static void m1()

public static void m2()

NoClassDefFoundError

// Java-программа для иллюстрации
// NoClassDefFoundError

public static void main(String[] args)

System.out.println( «HELLO GEEKS» );

ExceptionInInitializerError
Код 1:

// Java-программа для иллюстрации
// ExceptionInInitializerError

static int x = 10 / 0 ;

public static void main(String[] args)

Код 2:

// Java-программа для иллюстрации
// ExceptionInInitializerError

public static void main(String[] args)

Объяснение: Вышеуказанное исключение возникает всякий раз, когда выполняется статическое присвоение переменной и статический блок, если возникает какое-либо исключение.

IllegalArgumentException

// Java-программа для иллюстрации
// IllegalArgumentException

public static void main(String[] args)

Thread t = new Thread();

Thread t1 = new Thread();

t.setPriority( 7 ); // Верный

t1.setPriority( 17 ); // Исключение

Объяснение: Исключение возникает явно либо программистом, либо разработчиком API, чтобы указать, что метод был вызван с недопустимым аргументом.

IllegalArgumentException

// Java-программа для иллюстрации
// IllegalStateException

public static void main(String[] args)

Thread t = new Thread();

Объяснение: Вышеуказанное исключение явно возникает либо программистом, либо разработчиком API, чтобы указать, что метод был вызван в неправильное время.

Читать еще:  Java kafka consumer

AssertionError

// Java-программа для иллюстрации
// AssertionError

public static void main(String[] args)

// Если х не больше или равно 10

// тогда мы получим исключение во время выполнения

Объяснение: Вышеуказанное исключение явно вызывается программистом или разработчиком API, чтобы указать, что утверждение assert не выполнено.

Эта статья предоставлена Бишал Кумар Дубей . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

BestProg

Классы Java для обработки исключительных ситуаций из пакета java.lang . Методы класса Throwable . Примеры

Содержание

1. Типы исключений, которые поддерживаются системой обработки исключений Java

В языке программирования Java разработан эффективный механизм обработки исключений. В основе этого механизма лежат классы образующие иерархию. Для всех классов исключений Java базовым классом есть класс Throwable .

Из класса Throwable унаследованы два основных класса:

  • Exception – предназначен для задания исключительных условий, которые перехватываются программой. Если нужно объявить собственный класс (тип) исключений, то этот класс может быть унаследован от класса Exception ;
  • Error – класс, который предназначен для описания исключений (ошибок) возникающих в самой среде Java. Такие исключения не оговариваются во время нормального выполнения прикладной программы. Примеры системных ошибок: недостаточно памяти, переполнение стека.

Схема верхнего уровня иерархии классов Java приведена на рисунке

Рисунок. Вершина иерархии классов исключений Java

2. Классификация исключений по признаку наличия в операторе throws . Непроверяемые исключения. Проверяемые исключения

Как известно, метод может генерировать исключения, которые могут быть перехвачены в других методах высших уровней. При этом, метод должен указывать перечень обрабатываемых исключений в операторе throws .

Более подробно о работе оператора throws описывается в теме:

Если тип сгенерированного исключения есть подклассом стандартного класса RuntimeException , то не обязательно указывать этот тип в перечне оператора throws метода. Такое исключение называется непроверяемым исключением. В этом случае компилятор не проверяет обрабатываются или генерируются такие исключения в некотором месте программы.

Если тип сгенерированного исключения не является подклассом стандартного класса RuntimeException , то это исключение называется проверяемое исключение. В случае генерирования такого типа исключения, его нужно обязательно включать в оператор throws .

3. Перечень подклассов непроверяемых исключений из пакета java.lang

Среди всего разнообразия классов и интерфейсов пакет java.lang содержит мощный арсенал классов для обработки исключений. Эти классы и интерфейсы составляют основу всех программ на Java. Пакет java.lang автоматически импортируется во все программы.

Ниже приведен перечень подклассов непроверяемых исключений производными от класса RuntimeException и которые определены в пакете java.lang :

  • ArithmeticException – арифметическая ошибка (например, деление на ноль);
  • ArrayIndexOutOfBoundsException – индекс за пределами массива;
  • ArrayStoreException – присваивание элементу массива объекта несовместимого типа;
  • ClassCastException – неправильное приведение типов;
  • EnumConstantNotPresent – попытка воспользоваться неопределенным значением перечисления;
  • IllegalArgumentException – недопустимый аргумент при вызове метода;
  • IllegalMonitorStateException – недопустимая контрольная операция;
  • IllegalStateException – неверное состояние среды или приложения;
  • IllegalThreadStateException – несовместимость запрашиваемой операции с текущим состоянием потока выполнения;
  • IndexOutOfBoundsException – выход индекса некоторого типа за допустимые границы;
  • NegativeArraySizeException – создание массива отрицательного размера;
  • NullPointerException – неправильное использование пустой ссылки;
  • NumberFormatException – неправильное преобразование символьной строки в числовой формат;
  • SecurityException – попытка нарушения безопасности;
  • StringIndexOutOfBounds – попытка доступа по индексу за пределами символьной строки;
  • TypeNotPresentException – тип не найден;
  • UnsupportedOperationException – найдена неподдерживаемая операция.
4. Проверяемые исключения из пакета java.lang

Если тип сгенерированного исключения не является подклассом стандартного класса RuntimeException , то это исключение называется проверяемым исключением. В случае генерирования такого типа исключения, его обязательно нужно включать в оператор throws метода.

В языке Java в пакете java.lang реализован ряд проверяемых исключений. Ниже приведен их перечень:

  • ClassNotFoundException – класс не найден;
  • CloneNotSupportedException – попытка клонировать объект из класса, который не реализует интерфейс Cloneable ;
  • IllegalAccessException – запрещен доступ к классу;
  • InstantiationException – попытка создать объект абстрактного класса или интерфейса;
  • InterruptedException – один поток выполнения прерван другим потоком;
  • NoSuchFieldException – запрашиваемое поле не существует;
  • NoSuchMethodException – запрашиваемый метод не существует;
  • ReflectiveOperationException – суперкласс исключений, связанных с рефлексией.
Читать еще:  Java io ioexception

Также, в перечень исключений оператора throws обязательно нужно включать собственноручно разработанные классы исключений для их проверки.

5. Какое назначение класса Throwable ? Методы класса Throwable

Класс Throwable есть базовым для всех стандартных классов исключений Java. Этот класс предоставляет ряд методов, которые можно использовать или переопределять в собственных классах обработки исключений. Эти классы должны быть унаследованы от класса Exception , который унаследован от класса Throwable (см. рисунок). Класс Exception не содержит методов.
Ниже приведен перечень методов класса Throwable .

добавляет заданное исключение в список подавляемых исключений. Этот список связывается с вызывающим (данным) исключением. Метод используется для применения в операторе try с ресурсами.

возвращает объект класса Throwable , содержащий полную трассировку стека. Этот объект может быть сгенерирован повторно.

возвращает исключение, лежащее в основе текущего исключения. Метод возвращает null в случае, если такое исключение отсутствует. Этот метод используется при создании цепочек исключений – он вызывает исключение, вызывающее текущее исключение.

возвращает локализованное описание исключения.

возвращает описание исключения.

возвращает массив, содержащий поэлементную трассировку стека в виде объектов класса StackTraceElement .

получает подавленные исключения, связанные с вызывающим исключением, и возвращает массив, который содержит результат. Подавленные исключения генерируются в операторе try с ресурсами.

связывает входной параметр причина_исключения с вызывающим исключением, указывая его как причину этого вызывающего исключения. Возвращает ссылку на исключение. Метод используется при создании цепочек исключений.

выводит трассировку стека.

10. Метод printStackTrace() имеет еще две перегруженных реализации

Метод направляет трассировку стека в заданный поток_вывода .

устанавливает трассировку стека для заданных элементов.

возвращает объект типа String содержащий описание исключения. Этот метод можно вызвать из метода println() при выводе объекта типа Throwable .

6. Пример использования некоторых методов класса Throwable . Разработка собственного класса исключения

В примере демонстрируется использование некоторых методов класса Throwable :

  • getLocalizedMessage() ;
  • getMessage() ;
  • t oString() ;
  • getStackTrace() ;
  • fillInStackTrace() .

Объявляется класс MyException , унаследованный от класса Exception . В иерархии классов исключений Java класс Exception унаследован от класса Throwable . Поэтому, класс MyException может использовать и переопределять методы класса Throwable .

Текст программы следующий:

Объясним некоторые фрагменты кода.

С целью демонстрации в классе MyException переопределяется метод getLocalizedMessage() . При вызове этого метода выводится сообщение из этого переопределенного метода. По данному примеру можно переопределять другие методы класса Throwable .

В функции main() продемонстрировано использование методов класса Throwable . Вводится переменная x , которая проверяется на допустимые значения в пределах то 0 до 100. Если значение x меньше 0 или больше 100, то генерируется исключение типа MyException .

3 Steps to Fix NoSuchMethodErrors and NoSuchMethodExceptions

A NoSuchMethodError occurs when we’re calling a method that does not exist at runtime.

The method must have existed at compile time, since otherwise the compiler would have refused to compile the >error: cannot find symbol .

Common Causes and Solutions

Let’s discuss some common situations that cause a NoSuchMethodError.

Breaking Change in a 3rd Party Library

The potential root cause for a NoSuchMethodError is that one of the libraries we use in our project had a breaking change from one version to the next. This breaking change removed a method from the code of that library.

However, since our own code calling the method in question has been successfully compiled, the classpath must be different during compile time and runtime.

At compile time we use the correct version of the library while at runtime we somehow included a different version that does not provide the method in question. This indicates a problem in our build process.

Overriding a 3rd Party Library Version

Imagine we’re using a 3rd party library (A) as described above, but we’re not calling it directly. Rather, it’s a dependency of another 3rd party library (B) that we use (i.e. A is a transitive dependency to our project).

In this case, which is the most common cause for NoSuchMethodErrors in my experience, we probably have a version conflict in our build system. There probably is a third library (C) which also has a dependency on B, but on a different version.

Build systems like Gradle and Maven usually resolve a version conflict like this by simply choosing one of the versions, opening the door for a NoSuchMethodError.

Breaking Change in Our Own Module

The same can happen in multi-module builds, though this is less common. We have removed a certain method from the code in one module (A) and during runtime the code of another module (B) fails with a NoSuchMethodError.

This indicates an error in our build pipeline since module B obviously has not been compiled against the new version of module A.

Читать еще:  Wrong data type java lang illegalargumentexception

Fixing a NoSuchMethodError

There are a lot of different flavors of NoSuchMethodError s, but they all boil down to the fact that the compile time classpath differs from the runtime classpath.

The following steps will help to pinpoint the problem:

Step 1: Find Out Where the Class Comes From

First, we need to find out where the >NoSuchMethodError :

Now, we can search the web or within the >Service class from our own codebase and not a class from another library.

If we have trouble finding the JAR file of the >-verbose:class when running our application. This will cause Java to print out all classes and the JARs they have been loaded from:

Step 2: Find Out Who Calls the Class

Next, we want find out where the method is being called. This information is available in the first element of the stack trace:

Here, the >ProvokeNoSuchMethodError tries to call a method that does not exist at runtime. We should now find out which library this file belongs to.

Step 3: Check the Versions

Now that we know where the NoSuchMethodError is provoked and what method is missing, we can act.

We should now list all of our project dependencies.

In Gradle, we can call:

If we’re using Maven, a similiar result can be achieved with:

In this file, we can search for the libraries that contain the class with the missing method and the class that tries to call this method.

Usually we’ll find an output like this somewhere:

The above means that the spring-retry library depends on spring-core in version 4.3.13, but some other library also depends on spring-core in version 5.0.8 and overrules the dependency version.

We can now search our dependencies.txt file for 5.0.8.RELEASE to find out which library introduces the dependency to this version.

Finally, we need to decide which of the two versions we actually need to satisfy both dependencies. Usually, this is the newer version since most frameworks are backwards compatible to some point. However, it can be the other way around or we might even not be able to resolve the conflict at all.

And What About NoSuchMethodException?

NoSuchMethodException is related to NoSuchMethodError , but occurs in another context. While a NoSuchMethodError occurs when some JAR file has a different version at runtime that it had at compile time, a NoSuchMethodException occurs during reflection when we try to access a method that does not exist.

This can be easily provoked with the following code:

Here, we’re trying to access the method foobar() of >String , which does not exist.

The steps to find the cause of the exception and to fix it are pretty much the same as those for the NoSuchMethodError .

Conclusion

This article went through some common causes of NoSuchMethodError s and NoSuchMethodException s and walked through some steps that can help to fix them.

We need to find out where the error is caused and who causes it before we can compare versions and try to fix the problem.

Follow me on Twitter, LinkedIn, or my Mailing List to be notified of new content.

Tom Hombergs

As a professional software engineer, consultant, architect, and general problem solver, I’ve been practicing the software craft for more than ten years and I’m still learning something new every day. I love sharing the things I learned, so you (and future me) can get a head start.

Get 66% Off My eBook

Liked this article? Subscribe to my mailing list to get notified about new content and get 66% off my eBook «Get Your Hands Dirty on Clean Architecture».

Ссылка на основную публикацию
Adblock
detector