未捕获nosuchmethodexception

yiytaume  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(406)

**结案。**此问题不可复制或由打字错误引起。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

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 ,但不会被抓住。

fwzugrvs

fwzugrvs1#

这有两种变体
nosuchmethoderror—它的基类是error—编译器使用它来检测所使用的方法是否存在,或者在运行时检测是否存在所使用的方法,例如升级或降级特定的依赖jar,并且该方法未在包含的新jar中的类中定义。
nosuchmethodexception—它将基类作为异常,这通常是您在使用反射时得到的,并且您尝试访问的带有'name'的方法没有在该类中定义。
但是,如果您有带有throwable的catch块,那么这两个都应该被捕获,因为throwable是错误和异常的基础。

ldfqzlk8

ldfqzlk82#

您正在使用 getMethod 以错误的方式。必须传递方法的名称和参数数组。以下是正确方法的示例:

class Main {
    public static void main(String[] args) {
        try {
            Class[] arguments = new Class[1];
            arguments[0] = String.class;
            String.class.getMethod("concat", arguments);
        } catch (NoSuchMethodException e) {
            System.out.println("Error occured");
        }
    }
}

检查签名 String#concat 它接受一个类型的参数, String .

另一个例子:

class MyClass {
    public void hello(String name) {
        System.out.println("Hello " + name);
    }

    public int getSum(int x, int y) {
        return x + y;
    }
}

class Main {
    public static void main(String[] args) {
        try {
            Class[] arguments = new Class[1];
            arguments[0] = String.class;
            MyClass.class.getMethod("hello", arguments);
            System.out.println("This one passed.");

            arguments = new Class[2];
            arguments[0] = int.class;
            arguments[1] = int.class;
            MyClass.class.getMethod("getSum", arguments);
            System.out.println("This one too.");

            // The following one will fail
            MyClass.class.getMethod("foo");
        } catch (NoSuchMethodException e) {
            System.out.println("Error occured");
        }
    }
}

输出:

This one passed.
This one too.
Error occured

更新:

此更新基于霍尔格的以下宝贵意见: 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[] 手动排列。

class MyClass {
    public void hello(String name) {
        System.out.println("Hello " + name);
    }

    public int getSum(int x, int y) {
        return x + y;
    }
}

class Main {
    public static void main(String[] args) {
        try {
            MyClass.class.getMethod("hello", String.class);
            System.out.println("This one passed.");

            MyClass.class.getMethod("getSum", int.class, int.class);
            System.out.println("This one too.");

            // The following one will fail
            MyClass.class.getMethod("foo");
        } catch (NoSuchMethodException e) {
            System.out.println("Error occured");
        }
    }
}
6mzjoqzu

6mzjoqzu3#

import java.lang.reflect.Method;

public class NoSuchMethodMethodTest
{   
    public static void checkIfMethodNotExist()
    {
        try
        {
            final NoSuchMethodMethodTest noSuchMethodMethodTest = new NoSuchMethodMethodTest();
            Class clazz = noSuchMethodMethodTest.getClass();
            final Method m = clazz.getMethod("demo", null);
        }
        catch (NoSuchMethodException e)
        {
            System.out.println("demo method not exist");
        }
    }

    public static void checkIfMethodExist()
    {
        try
        {
            final NoSuchMethodMethodTest noSuchMethodMethodTest = new NoSuchMethodMethodTest();
            Class clazz = noSuchMethodMethodTest.getClass();
            final Method m = clazz.getMethod("main", String[].class);

        }
        catch (NoSuchMethodException e)
        {
            System.out.println("main method exist");
        }
    }
}
eblbsuwk

eblbsuwk4#

java异常层次结构如下所示:

Throwable
 |      |
Error   Exception
        |
        RuntimeException

错误是用来表示jvm内部问题和其他异常情况的信号,这些异常情况通常是程序无论如何都无法处理的。所以,在你的代码中你没有捕捉到它们。试着抓住 Throwable 取而代之的是:

boolean result = false;
try{
   result =  Settings.canDrawOverlays(context);
}
catch(Throwable e){
    Log.e("error","error");
}

读这篇文章也是个好主意

相关问题