【Java】控制异常在控制台输出

每次在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();
	}

}
运行结果如下:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值