【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();
	}

}

运行结果如下:

时间: 2024-10-20 14:39:23

【Java】控制异常在控制台输出的相关文章

java项目中eclipse控制台输出log4j的信息

最近做的一个hadoop项目中,用MR实现了一个比较复杂的问题,其中的日志信息都是使用的是log4j来处理的.但不知怎么控制台不输出日志信息,只能输出System.out.println()信息,这个调试带了很多的麻烦 再次记录一下,怎么在控制台输出日志信息. 在debug模式中,选择Arguments,在底下的VM arguments中输入“-Dlog4j.debug”即可.如下图

Java代码工具箱之控制台输出重定向_控制台输出到文件

1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. 1 //自定导入必要库 2 //然后往 Main 的 最开始一塞即可 3 //文件是否会自动新建,未测试 4 5 try { 6 System.setOut(new PrintStream(new FileOutputStream("D:\\systemOut.txt"))); 7 } catch (FileNot

【Java】Eclipse新建的Java文件自动生成主函数、控制台输出行数不再受限制

一.新建的Java文件自动生成主函数 虽然只是一个很简单的事情,但应该还是有人不知道了,每次新建Java文件都要手动输入public static void main(String args[]){},非常麻烦,其实Eclipse可以自动生成这行,只是大多数的Java文件都是没有主函数的,所以这行默认关闭, 右击Java项目下的src可以选择New->Class也就可以新建类 然后在弹出的对话框上勾上自动产生主函数,点击确认,在生产的Java文件中就有主函数了 二.Eclipse控制台输出行数不

C#在控制台输出异常所在的行数

对于异常,我们经常用try-catch语句来处理,一种常见的方式是在catch语句块用MessageBox.Show("异常")这种弹窗的方式来报告异常.但是有些时候,有些异常发生时我们不希望弹窗干扰用户,只是想要打印出异常信息查找原因.分析调试而已. 这时候常用的方法有:打印log将异常信息保存到文本中.将异常信息输出到可显示文本的控件中.将异常打印到"输出"窗口中. 其中涉及的关键问题是:如何快速定位异常所在的位置.如果可以输出异常所在的行数其实就可以很好解决这

Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值

1. 键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值 分析: •  创建键盘录入数据对象 •  键盘录入多个数据,我们不知道多少个,所以用集合存储 •  以0结束,这个简单,只要键盘录入的数据是0,我就不继续录入数据了 •  把集合转成数组 •  对数组排序 •  获取该数组中的最大索引的值 2. 代码实现: 1 1. package cn.itcast_03; 2 3 import java.util.ArrayList; 4 import java.util.Arrays;

java控制台输出print和println详解

在使用java编程的过程中,控制台输出用得不少,今天我想梳理一下,print.println.printf三者的区别. 一.print 通过System.out.print方法调用,print方法的参数有很多种:boolean.char.char[].String.int.float.double.long等. print的输出末尾不换行. 1.print(boolean b) 打印boolean类型时,输出只有true和false两种.我们查看print(boolean b)的源代码,可以看到

JAVA异常处理原则和log4j输出详细异常分析

1.多用try,catch;不要一个try,catch包含所有内容 好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行 2.多写几个catche:尽量不要使用Exception这个大异常去包容所有异常 不要为了追求代码的简练,try,catch只写一个,使用Exception去抓取所有可能的异常,这只是理想状态,程序出错不是直接打印出来异常就完事了,应该在catche抓取异常的同时一方面给程序员输出错误日志,一方面做些处理反馈给用户,比如一些提示错误框或者错误页面,不能让用

如何用java编程在控制台输出当前时间

如何用java编程在控制台输出当前时间 package com.chimp4.p155; import java.text.SimpleDateFormat; import java.util.Date; public class Account { /** * 日期格式化 * @author young * */ public static void main(String[] args) { // 在构造器中传入日期样式 // SimpleDateFormat sdf=new SimpleD

Java 单元测试如何断言(检查)控制台输出

关于在 JUnit 单元测试中如何断言某个函数的控制台输出已是我一个长久的问题. 虽然有控制台输出的函数有了副作用, 不能称之为一个纯函数, 在讲求函数式编程的今天, 纯函数是最好测试的, 所谓的 Data In, Data Out. 但总还是有这样的需求, 比如自己实现的某个日志框架的 Appender, 需要验证它向控制台的输出内容. 我先前在项目中的办法是, 先把把标准输出定向到一个 ByteArrayOutputStream 中去, 完后把这个流转成字符串来断言它的内容, 最后恢复标准输