Java封装错误日志

本文作者谢景,分享了在实际项目中封装错误日志的重要性,并详细解释了如何使用`Thread.currentThread().getStackTrace()`来获取堆栈信息,包括类名、文件名、行号和方法名。文中通过除0异常和索引越界异常两个实例演示了错误日志的记录方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java封装错误日志

作者:谢景,撰写:2019-4-25

在实际项目中,我们项目中多多少少会出现bug,这时候写一个错误日志可以方便我们以后查找并优化。
下面是本人封装的错误日志:

//声明一个继承异常类的泛型类作为形参,接收方法的错误异常信息
public static <T extends Exception> void Exceptionde(T t) { 
       //获取调用者的类名;
		String classType=	Thread.currentThread().getStackTrace()[2].getClassName();
		//获取调用者的方法名;
		String funType=	Thread.currentThread().getStackTrace()[2].getMethodName();	
	   //获取调用者调用本方法的行数;
		int linType=	Thread.currentThread().getStackTrace()[2].getLineNumber();	
		try {
		
			File file = new File("F:/z/error log.txt");//实例化文件类,以便存储错误信息
			if (file.exists()) {//exists():判断该文件是否存在;
			//声明一个随意访问类,声明可以读写
				RandomAccessFile accessFile=new RandomAccessFile("F:/z/error log.txt","rw");
			    //实例化StringBuffer 字符串;
				StringBuffer buffer = new StringBuffer("");
				//给字符串追加数据;
				//追加错误发生时间
				buffer.append("时间:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:sss").format(new Date())+ '\n');
				//追加产生错误的类和方法和行号,方便以后快速定位;
				buffer.append(classType+"类的"+ funType+"方法中/行号为(" +linType +");");
				//追加错误信息,快速找到错误原因
				buffer.append("出现异常类型:" + t.getClass().getName().toString() + ";"+"详细消息:" + t.getMessage() +'\n'+'\n');
				//将字符串转换为byte数组;
				byte[] b = buffer.toString().getBytes();
				//seek(): 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
				accessFile.seek(accessFile.length());
				//将bye数组以流的形式传到错误日志文件;
				accessFile.write(b);
				//关闭流
				accessFile.close();
			} else {//如果文件不存在,就创建文件
			//createNewFile(); 创建文件;
				file.createNewFile();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}			
	}

下面是上面方法中用到的语法分析:

Thread.currentThread().getStackTrace()[2].getClassName();
Thread是线程类
currentThread()方法是 返回对当前正在执行的线程对象的引用
getStackTrace()方法是 返回一个表示该线程堆栈转储的堆栈跟踪元素数组
注重:getStackTrace()方法存的是数组,第一位存的是自己本身,第二位存的是调用该方法的方法,第三位是调用该方法的调用方法,以此类推;
简单说就是:
getStackTrace()[0]=getStackTrace
getStackTrace()[1]=调用getStackTrace方法的对象,在上面就是Exceptionde方法
getStackTrace()[2]=调用Exceptionde方法的对象;
在这里要注意的就是如果如果没有调用对象,对应的索引就不存在;在这里没有方法调用Exceptionde方法;所以getStackTrace()[2]是不存在的,如果写了会报索引越界异常;


getStackTrace()返回的具体的对象可以有下面的一些方法来获取对象的某些属性;
getClassName()
返回类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点。
getFileName()
返回源文件名,该文件包含由该堆栈跟踪元素所表示的执行点。
getLineNumber()
返回源行的行号,该行包含由该堆栈该跟踪元素所表示的执行点。
getMethodName()
返回方法名,此方法包含由该堆栈跟踪元素所表示的执行点。

下面做一些异常实例,然后调用了上面的方法:
这里提供是两种异常:除0异常和索引越界异常!

public void text(){
		try {
			int a = 1, b = 0;
			int c = a / 0;
		} catch (ArithmeticException e) {// ArithmeticException:-----Arithmetic算数,Exception异常
			ExceptionDemo.Exceptionde(e);
		}
		try {
			int[] is = new int[1];
			is[3] = 3;
		} catch (Exception e1) {
						
			ExceptionDemo.Exceptionde(e1);
		}	
}

下面是结果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值