当我收到IOException
或RunTimeException
等异常时,我只能知道班级中的行号。
我的第一个问题。是否可以通过异常检索方法名称? 第二,是否可以通过行号?
检索该方法的方法和参数P.S。我需要知道确切的方法名称及其参数,因为我想区分重载方法。为了区分重载方法,我所知道的就是确定它的参数。
答案 0 :(得分:6)
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
答案 1 :(得分:0)
如果查看堆栈跟踪,您可以知道错误发生在哪一行。
使用覆盖方法时,您可以获得确切的类名,源文件和行号,只需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)
这就是说,问题发生在方法line 9
中的文件MyClass.java
的{{1}}中,而mash
方法又由crunch
方法调用ine 6
在同一文件的main
中由line 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第一次有点难以掌握,但后来它们成为一个非常强大的工具。
我希望这会有所帮助。
答案 2 :(得分:0)
将异常传递给它,它将打印方法的参数类型以及异常
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");
}
}