详述java异常

目录

 

一.什么是异常

二.异常的后果

三.异常的分类

四.异常的处理方式

五.log4j


一.什么是异常

异常就是程序运行过程中出现了不正常严重错误,以下是几个异常的示例:

public class Test {

	public static void main(String[] args) {
		System.out.println(1/0);
		String name=null;
		System.out.println(name.length());
	}
}

二.异常的后果

 如果在异常的代码前后各写一个输出语句,打印结果中显示只有异常代码前的语句可以执行,异常代码之后的语句无法执行:

public class Test {

	public static void main(String[] args) {
		System.out.println("111");
		System.out.println(1/0);
		System.out.println("222");
	}
}

 这就是异常的后果,如果程序出现异常,则同级代码不会再运行。

三.异常的分类

异常叫做Exception,它的父类是Throwable,Throwable包含Exception和Error两个子类,Error是错误,不属于程序员处理的范畴,我们要处理的就是Exception,异常。

异常大体分为两大类,一个是RuntimeException运行时异常,其余的异常都归为第二类叫做检查时异常

1.运行时异常

顾名思义就是只有在程序运行之后才会出现的异常,它在你写完代码后是不会报错的,可以不显式的对异常处理,javac依然可以编译程序。文章开头举的几个例子都是运行时异常:

public class Test {

	public static void main(String[] args) {
		System.out.println(1/0);
		String name=null;
		System.out.println(name.length());
	}
}

2.检查时异常

检查时异常就是在程序还没有运行就被检查出来的异常,必须显式对异常进行处理,不然javac不会对程序进行编译。当然不包括拼写错误的那种低级错误,就像如下的异常:

public class Test {

	public static void main(String[] args) {
		Class.forName(" ");
	}
}

我们可以看到刚将代码写完编译器就会报错:

四.异常的处理方式

当程序出现异常的时候,无论是检查时异常还是运行时异常,最终都需要对其进行处理。

1.try-catch:

详情见博客:详述try-catch-fianlly

2.throw-throws:

详情见博客: 详述throw和throws

五.log4j

1.为什么要用log4j

当一个规模较大的项目在调试的过程中,会出现非常多的异常,这时还可以用上述的方式对这些异常进行处理吗?

我们先来模拟一下当大量异常出现时的情况,我们在异常的处理语句外加上一个死循环,并定义一个累加的变量观察异常出现的个数:

public class Test {

	public static void main(String[] args) {
		int i=1;
		while (true) {
			try {
				System.out.println(1 / 0);
			} catch (ArithmeticException e) {
				e.printStackTrace();
			} 
			System.out.println(i);
			i++;
		}
	}
}

这时我们运行之后便模拟出了大量的异常:

这时我们将运行结果往上看到顶端,问题就出现了,异常的个数是从47196开始计数的?

对于该现象的解释就是,我们现在在做的事情是将所有的这些异常都打印在控制台上,而控制台是有一定的缓存空间的,当缓存满了以后,还有源源不断的信息传来,这时最先进入的异常信息将会被移除,所以在程序运行期间无法将大量的异常信息全部呈现在控制台上,为了全面收集所有的异常信息,log4j诞生了。

log4j的作用是将所有的异常信息全部输出到磁盘的一个文件上去,因为在硬盘上可以认为内存无限大,所以足够收集全部的异常信息。

2.如何配置log4j

第一步,导入log4j-1.2.15.jar包

详情见博客:jar包的导入

第二步,创建log4j.properties的文件

右键点击src,在根目录下创建名为log4j.properties的文件:

然后在该文件中复制粘贴如下的代码:

# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,Console,RollingFile

#将日志信息输出到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= [%-5p]-[%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n
#将日志信息输出到操作系统D盘根目录下的log.log文件中
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=D://log.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n

 

第三步,创建Test类

引入log4j的jar包,定义一个Logger类对象,使用logger的方法来处理异常,代码如下:

package moon;

import org.apache.log4j.Logger;

public class Test {

	static Logger logger=Logger.getLogger(Test.class);
	
	public static void main(String[] args) {
		int i=1;
		while (true) {
			try {
				System.out.println(1 /0);
			} catch (Exception e) {
				logger.debug(e.getMessage(), e);
			} 
			System.out.println(i);
			i++;
		}
	}
}

 此时再运行,将控制台拖到顶部,发现还是从47000多开始的,但是别忘了,log4j的作用是将异常信息存入硬盘,所以打开硬盘就会找到全部的异常信息了。

打开D盘中的log.log文件,就能看到全部的异常信息了:

 

3.弊端

log4j存在着一个弊端,当异常的信息非常多的时候,将大量的信息存在一个文件中并不方便查找,所以为了解决这个问题,可以使用间歇性生成的方法,就是将下面的代码复制粘贴到刚才创建的log4j.properties文件中,它的特点就是每分钟新建一个文件来存储传入的异常信息:

# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,RollingFile
#每天产生一个日志文件(RollingFile)  
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
#当天的日志文件全路径
log4j.appender.RollingFile.File=d:/logs/sirius.log
#服务器启动日志是追加,false:服务器启动后会生成日志文件把老的覆盖掉
log4j.appender.RollingFile.Append=true
#日志文件格式  
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout  
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
log4j.appender.RollingFile.Threshold=DEBUG
#设置每天生成一个文件名后添加的名称,备份名称:sirius.log.年月日时分.log
log4j.appender.RollingFile.DatePattern='.'yyyy-MM-dd-HH-mm'.log'

 这时我们再执行代码超过一分钟以后,就会看到D盘中的logs文件里会是这样的:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值