有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过解析异常来获取方法名及其包含的参数

当我收到诸如IOExceptionRunTimeException之类的异常时,我只能知道类中的行号

我的第一个问题。是否可以通过异常检索方法名? 第二,是否可以通过行号检索该方法和该方法的参数

另外,我需要知道确切的方法名称及其参数,因为我想区分重载方法。为了区分重载方法,我只知道确定它的参数


共 (3) 个答案

  1. # 1 楼答案

    try{
    //your code here}
    catch(Exception e){
      for (StackTraceElement st : e.getStackTrace())
      {
        System.out.println("Class: " + st.getClassName() + " Method : " 
                          +  st.getMethodName() + " line : " + st.getLineNumber());  
       }
    }
    

    正如您在上面的代码中所看到的,您可以获取stackTrace并在其上循环,以获取所有方法名称和行号,有关更多信息,请参阅此http://download.oracle.com/javase/1.4.2/docs/api/java/lang/StackTraceElement.html

  2. # 2 楼答案

    将异常传递给它,它将打印方法的参数类型以及异常

    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class Main
    {
        public static void main(String[]  args)
        {
            new Main().run();
        }
        public void run(){
            try
            {
                new Car().run(60, "Casino");
            }
            catch (Exception e)
            {
                detailedException(e);
            }
            try
            {
                new Engine().run(10);
            }
            catch (Exception e)
            {
                detailedException(e);
            }
        }
        public void detailedException(Exception e)
        {
            try
            {
                StringBuilder buffer = new StringBuilder(e.getClass().getName()).append(" \"").append(e.getMessage()).append("\"\n");
                for (var trace: e.getStackTrace())
                {
                    buffer.append("\tat ").append(trace.getClassName()).append(".").append(trace.getMethodName()).append("(").append(trace.getFileName()).append(":").append(trace.getLineNumber()).append(")[");
                    Class<?> clazz = Class.forName(trace.getClassName());
                    ArrayList<Method> methods = new ArrayList<>(Arrays.asList(clazz.getMethods()));
                    methods.removeIf(m -> !m.getName().equals(trace.getMethodName()));
                    Method method = methods.get(0);
                    for (var param: method.getParameters())
                    {
                        buffer.append(param.getName()).append(":").append(param.getParameterizedType().getTypeName()).append(", ");
                    }
                    buffer.append("]->").append(method.getGenericReturnType().getTypeName()).append("\n");
                }
                System.err.println(buffer);
            }
            catch (Exception parseFailed){
                e.printStackTrace();
            }
        }
    }
    class Car extends Engine
    {
        public void run(int when, String where) throws Exception 
        {
            super.run(25);
        }
    }
    class Engine
    {
        public String run(int For) throws Exception 
        {
            throw new Exception("need more fuel");
        }
    }
    
  3. # 3 楼答案

    如果查看stacktrace,可以知道错误发生在哪一行

    当使用重写方法时,您可以得到确切的类名、源文件和行号,只需know how to read it.

    从那一页:

     java.lang.NullPointerException
             at MyClass.mash(MyClass.java:9)  //< - HERE!!!!
             at MyClass.crunch(MyClass.java:6)
             at MyClass.main(MyClass.java:3)
    

    这就是说,问题发生在方法{}中文件{}的{}中,该方法又被同一文件的{}中的{}方法{}调用

    以下是源代码:

     class MyClass {
         public static void main(String[] args) {
             crunch(null); // line 3
         }
         static void crunch(int[] a) {
             mash(a); // line 6 
         }
         static void mash(int[] b) {
             System.out.println(b[0]);//line 9, method mash.
         }
     }
    

    基本上你只需要。。。读得好

    Stacktraces第一次有点难掌握,但后来它们变成了一个非常强大的工具

    我希望这有帮助