**结案。**此问题不可复制或由打字错误引起。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
20天前关门了。
改进这个问题
我在努力抓住机会 NoSuchMethodException
在以下代码中:
try {
method = currentClass.getMethod(arg1,arg2);
break;
}
catch (NoSuchMethodException e) {
System.out.println("hi");
}
不会被抓住的。我试过了 catch (Throwable e)
以及 catch (Exception e)
以及 catch (NoSuchMethodError e)
但都没用。
即使当我运行代码时,控制台显示 NoSuchMethodException
,但不会被抓住。
4条答案
按热度按时间fwzugrvs1#
这有两种变体
nosuchmethoderror—它的基类是error—编译器使用它来检测所使用的方法是否存在,或者在运行时检测是否存在所使用的方法,例如升级或降级特定的依赖jar,并且该方法未在包含的新jar中的类中定义。
nosuchmethodexception—它将基类作为异常,这通常是您在使用反射时得到的,并且您尝试访问的带有'name'的方法没有在该类中定义。
但是,如果您有带有throwable的catch块,那么这两个都应该被捕获,因为throwable是错误和异常的基础。
ldfqzlk82#
您正在使用
getMethod
以错误的方式。必须传递方法的名称和参数数组。以下是正确方法的示例:检查签名
String#concat
它接受一个类型的参数,String
.另一个例子:
输出:
更新:
此更新基于霍尔格的以下宝贵意见:
getMethod
是varargs方法。不需要手动处理数组。你可以用String.class.getMethod("concat", String.class);
,MyClass.class.getMethod("hello", String.class);
,和MyClass.class.getMethod("getSum", int.class, int.class);
. 事实上,你的MyClass.class.getMethod("foo");
语句已经在使用该功能,因为它不会创建零长度Class[]
手动排列。6mzjoqzu3#
eblbsuwk4#
java异常层次结构如下所示:
错误是用来表示jvm内部问题和其他异常情况的信号,这些异常情况通常是程序无论如何都无法处理的。所以,在你的代码中你没有捕捉到它们。试着抓住
Throwable
取而代之的是:读这篇文章也是个好主意