- Что вызывает java.lang.reflect.Исключение InvocationTargetException?
- 1. Обзор
- 2. Причина исключения InvocationTargetException
- 3. Как обрабатывать исключение InvocationTargetException?
- 4. Заключение
- Читайте ещё по теме:
- Understanding java.lang.reflect.InvocationTargetException and why it occurs
- Reason for java.lang.reflect.InvocationTargetException
- Handle InvocationTargetException
- java.lang.reflect.invocationtargetexception: null error
Что вызывает java.lang.reflect.Исключение InvocationTargetException?
Узнайте, что вызывает java.lang.reflect.Исключение InvocationTargetException.
1. Обзор
При работе с Java Reflection API часто встречается java.lang.reflect.InvocationTargetException . В этом уроке мы рассмотрим его и то, как с ним справиться, на простом примере .
2. Причина исключения InvocationTargetException
В основном это происходит, когда мы работаем со слоем отражения и пытаемся вызвать метод или конструктор, который сам создает базовое исключение.
Слой отражения обертывает фактическое исключение, вызванное методом, с помощью исключения InvocationTargetException . Давайте попробуем понять это на примере.
Давайте напишем класс с методом, который намеренно создает исключение:
public class InvocationTargetExample < public int divideByZeroExample() < return 1 / 0; >>
Теперь давайте вызовем описанный выше метод, используя отражение в простом тесте JUnit 5:
InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));
В приведенном выше коде мы утвердили исключение InvocationTargetException , которое возникает при вызове метода. Здесь важно отметить, что фактическое исключение – ArithmeticException в данном случае – оборачивается в InvocationTargetException.
Теперь вопрос, который приходит на ум, заключается в том, почему отражение не создает фактическое исключение в первую очередь?
Причина в том, что это позволяет нам понять, произошло ли Исключение из-за сбоя при вызове метода через слой отражения или оно произошло внутри самого метода.
3. Как обрабатывать исключение InvocationTargetException?
Здесь фактическое базовое исключение является причиной InvocationTargetException , поэтому мы можем использовать Throwable.getCause () , чтобы получить дополнительную информацию об этом.
Давайте посмотрим, как мы можем использовать getCause() для получения фактического исключения в том же примере, который использовался выше:
assertEquals(ArithmeticException.class, exception.getCause().getClass());
Здесь мы использовали метод getCause() для того же объекта exception , который был брошен. И мы утверждали ArithmeticException.class как причина исключения.
Таким образом, как только мы получим базовое исключение, мы можем перестроить его, обернуть в какое-то пользовательское исключение или просто зарегистрировать исключение в соответствии с нашими требованиями.
4. Заключение
В этой короткой статье мы рассмотрели, как слой отражения обертывает любое базовое исключение. Мы также видели, как определить основную причину исключения InvocationTargetException и как справиться с таким сценарием на простом примере.
Как обычно, код, используемый в этой статье, доступен на GitHub .
Читайте ещё по теме:
Understanding java.lang.reflect.InvocationTargetException and why it occurs
In this post, we will see about java.lang.reflect.InvocationTargetException .
You might get java.lang.reflect.InvocationTargetException while working with reflection in java.
Reason for java.lang.reflect.InvocationTargetException
Reflection layer throws this exception when calling method or constructor throws any exception. java.lang.reflect.InvocationTargetException wraps underlying exception thrown by actual method or constructor call.
Let’s see this with the help of example:
Create a simple class named StringUtils.java . It will have method getLengthOfString() which does not have null handling, so when we pass null to this method, it will throw java.lang.NullPointerException.
Create anther class to call getLengthOfString using reflection.
> catch ( NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e )
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.arpit.java2blog.ReflectionMain.main(ReflectionMain.java:16)
Caused by: java.lang.NullPointerException
at org.arpit.java2blog.StringUtils.getLengthOfString(StringUtils.java:7)
… 5 more
As you can see, we are getting java.lang.reflect.InvocationTargetException exception because of underlying NullPointerException.
Reflection layer wraps java.lang.reflect.InvocationTargetException around actual Exception to demostrate that this exception was raised during reflection API call.
Handle InvocationTargetException
As underlying exception is actual cause of InvocationTargetException, we can use Throwable’s getCause() method to get actual underlyting exception and use it to log or rethrow the exception.
java.lang.reflect.invocationtargetexception: null error
i am having issues loading the mod
with these mods
version is 1.19, trying to use the moreoverlays-1.21.1-mc1.19 version of the mod, forge version 41.1.0
edit:
this is what the latest.txt says
this is what the crash log says
Same error here with Forge Version 41.1.0 and Mod Version 1.21.1-mc1.19
Caused by 0: java.lang.reflect.InvocationTargetException at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[. ] <> at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[. ] <> at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[. ] <> at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[. ] <> at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[. ] <> at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:68) ~[javafmllanguage-1.19-41.1.0.jar%23151!/:?] <> at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$10(ModContainer.java:121) ~[fmlcore-1.19-41.1.0.jar%23150!/:?] <> at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[. ] <> at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[. ] <> at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[. ] <> at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[. ] <> at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[. ] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[. ] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[. ] <>
Caused by 1: java.lang.NoClassDefFoundError: net/minecraftforge/client/ConfigGuiHandler$ConfigGuiFactory at at.ridgo8.moreoverlays.MoreOverlays.(MoreOverlays.java:43) ~[moreoverlays-1.21.1-mc1.19.jar%23148!/:1.21.1-mc1.19] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[. ] <> at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[. ] <> at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[. ] <> at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[. ] <> at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[. ] <> at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:68) ~[javafmllanguage-1.19-41.1.0.jar%23151!/:?] <> at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$10(ModContainer.java:121) ~[fmlcore-1.19-41.1.0.jar%23150!/:?] <> at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[. ] <> at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[. ] <> at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[. ] <> at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[. ] <> at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[. ] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[. ] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[. ] <> Mod File: /D:/.Games/Minecraft/.minecraft_forge/mods/moreoverlays-1.21.1-mc1.19.jar Failure message: More Overlays Updated (moreoverlays) has failed to load correctly java.lang.reflect.InvocationTargetException: null Mod Version: 1.21.1-mc1.19 Mod Issue URL: https://github.com/r8420/MoreOverlays-1.15/issues Exception message: java.lang.ClassNotFoundException: net.minecraftforge.client.ConfigGuiHandler$ConfigGuiFactory
Stacktrace: at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:141) ~[securejarhandler-2.1.4.jar:?] <> at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[. ] <> at at.ridgo8.moreoverlays.MoreOverlays.(MoreOverlays.java:43) ~[moreoverlays-1.21.1-mc1.19.jar%23148!/:1.21.1-mc1.19] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[. ] <> at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[. ] <> at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[. ] <> at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[. ] <> at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[. ] <> at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:68) ~[javafmllanguage-1.19-41.1.0.jar%23151!/:?] <> at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$10(ModContainer.java:121) ~[fmlcore-1.19-41.1.0.jar%23150!/:?] <> at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[. ] <> at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[. ] <> at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[. ] <> at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[. ] <> at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[. ] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[. ] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[. ] <>
The issue is likely caused by this. 1.19 is unplayable with Forge 41.1.0 as of this moment.
Caused by 1: java.lang.NoClassDefFoundError: net/minecraftforge/client/ConfigGuiHandler$ConfigGuiFactory