每次在Java程出现问题,总会抛出一大堆异常,让人眼花缭乱,在Javaweb编程的时候尤甚,让人很难找到出错的位置,
尤其在你网络工程文件多、插件多、框架的时候,各种插件、框架连锁,导致你更难找到出错的位置。
其实异常在控制台输出是可以控制的。
关键是利用到,这个方法与数组、对象都是java自带的,不用引入任何东西:
StackTraceElement[] stacks = new Throwable().getStackTrace();
这个操作。
先看一段程序,
public static void exceptionMethodUnhandle() { int a = 1; int b = 0; System.out.println(a / b); }
这段程序很明显存在除0异常,直接运行会出现如下的错误:
我们要先找到,在第41行的exception的方法中的主函数main放大中出错,然后倒回去看,然后在第35行exception这个类中的exceptionMethodUnhandle这个方法中出错。
果真在第35行有a/b这个除0问题。
但是,在一些大型项目编程,会吐出一堆异常,你很难这样一步一步倒推。
把程序改成这样的话:
public static void exceptionMethod() { try { int a = 1; int b = 0; System.out.println(a / b); } catch (Exception e) { System.out.println(getTraceInfo()); } }
要求Java经过getTraceInfo()方法输出错误的话:
public static String getTraceInfo() { StringBuffer stringBuffer = new StringBuffer(); StackTraceElement[] stacks = new Throwable().getStackTrace(); stringBuffer.append("Exception in [class: ") .append(stacks[1].getClassName()).append("][method: ") .append(stacks[1].getMethodName()).append("][line: ") .append(stacks[1].getLineNumber() + "]"); return stringBuffer.toString(); }
输出结果接变成这样了:
直接指明在本程序的Exception类的exceptionMethod方法中出现异常。
之所以能够这样输出,我们要关注getTraceInfo()这个方法的StackTraceElement[] stacks = new Throwable().getStackTrace();方法。
这个数组如下:
可以看到,本数组第0个元素,是它自己,然后第1个元素,是导致它出现的方法、类与行数,第2个元素则记录了导致第一个元素出错的方法、类与行数,也就是说,导致出错的根本原因就是此数据的第一个元素。
因此我们在某些情况,仅仅输出这个元素就可以了。不用被长长的异常刷屏。
如果程序正常,根据java的try与catch,是根本不可能触发catch这段方法的。例如如下整个程序,先执行normalMethod()则正常输出1,执行exceptionMethod()才输出异常,最后执行exceptionMethodUnhandle()则默认输出整个异常:
public class exception { public static String getTraceInfo() { StringBuffer stringBuffer = new StringBuffer(); StackTraceElement[] stacks = new Throwable().getStackTrace(); stringBuffer.append("Exception in [class: ") .append(stacks[1].getClassName()).append("][method: ") .append(stacks[1].getMethodName()).append("][line: ") .append(stacks[1].getLineNumber() + "]"); return stringBuffer.toString(); } public static void normalMethod() { try { int a = 1; int b = 1; System.out.println(a / b); } catch (Exception e) { System.out.println(getTraceInfo()); } } public static void exceptionMethod() { try { int a = 1; int b = 0; System.out.println(a / b); } catch (Exception e) { System.out.println(getTraceInfo()); } } public static void exceptionMethodUnhandle() { int a = 1; int b = 0; System.out.println(a / b); } public static void main(String args[]) { normalMethod(); exceptionMethod(); exceptionMethodUnhandle(); } }
运行结果如下: