Java中try catch finally

本文深入解析Java中的异常处理机制,包括异常的概念、分类及其后果,重点讲解了运行时异常与检查时异常的区别,并演示了如何使用try-catch-finally及log4j进行异常捕获与日志记录。

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

一、异常

    1、什么是异常

        Java语言将运行时发生的不正常严重错误称为异常,对异常的处理成为异常处理。下面举出两种不同的异常:

public class Test {
	public static void main(String[] args) {
	System.out.println(1/0);
	Class.forName("");
	}
}

        由于数学运算时分母不可为零,所以此时在执行是会发生异常;而下面的Class.forMame后面括号中不存在类名,所以会发生异常。

    2、异常的后果

        一旦发生异常:同级代码将午饭执行,如:

    此时程序的结果为:111加上后面的System.out.println(1/0);报错提示(java.lang.ArithmeticException: / by zero

    3、Java中异常的分类:

        一、父类:throwable方法,两个子类:Exception与Error(继承)   父类中的两个常用方法

                  1、public String getMessage():获取异常信息;

                  2、public void printStackTrace():输出异常堆栈中的异常信息

        二、由于Error类中的错误是Java 中的JVM进行处理,所以本节所论述是:Exception中的异常,其中Exception中的异常可以分为两类:运行时异常(RuntimeException)和检查时异常(除RuntimeException中的Exception其他全部子类)

        三、如何区分运行时异常和检查时异常

            1、运行时异常:

            在Eclipse中书写编写代码时运行时异常是不会报错的即可以javac编译成功,如:

 

            2、检查时异常

            检查时异常是不能被Javac编译通过的

        在Eclipse中可以Ctrl键点击找到异常的父类从而确定

二、检查异常

    1、关键字try catch finally 检查异常

            一、try {} catch(Exception e){} 的使用

            将try括号后面的错误类型被catch捕捉当做其后面的形参;此时再执行catch后面的代码,此时即便是try后面的代码异常,也可以向下进行;

		System.out.println(100);
		try{
			System.out.println(1/0);
		}catch(ArithmeticException e) {
			e.printStackTrace();
		}
		System.out.println(200);

            二、try 之后的catch可以使用多个:

		try{
			System.out.println(1/0);
		}catch(ArithmeticException e) {
			e.printStackTrace();
		}catch(NullPointerException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.printStackTrace();
		}

            此时在检查类型是,从最前面的catch往后执行,检查到第一个符合标准的执行后面的语句(此时注意,即便是try后面的语句中又不止一个异常,由于执行到第一个异常时出现的同级代码不执行原理,也就只能检查到一个

            提示:catch括号后面的参数的类级别必须由小到大:否则由于多态的缘故会出现无法访问的代码

            三、finally:

            finally必须和try搭配:此时无论其中的代码是否执行,均会执行finally后的代码

		try{
			System.out.println(1);
		}catch(ArithmeticException e) {
			e.printStackTrace();
		}catch(NullPointerException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			System.out.println("可以有");
		}

            此时没有错误:但代码执行后:可以有

    2、使用log4j检查异常

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

运行结果第一行

        一、背景:在执行异常检测时,将异常信息打印控制台,存入一点缓存区中,缓存区饱满时,会删除前面的已有数据进而缓和数据,所以诞生了一个新的方法来将所有的异常检验全部导出:log4j

        二、如何使用log4j

            1、引入包(log4j-1.2.15.jar)

            2、在包中创建文件:log4j.properties

            3、在文件中输入下面的代码:

# 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

            4、在异常检测的类中创建对象

     static Logger logger = Logger.getLogger(类名.class);

            5.在catch关键字后面添加 

        logger.info(e.getMessage(),e);

            6、执行程序,在D盘中找到log.log进行查看

            可以看出,同样是第一行,在控制台上已经删除了一部分;

        三、间歇性产生新日志文件

        在检查错误时往往会时创建的log.log文件过大而不方便使用,此时我们可以采用每一分钟创建一个新的log.log文件、从而是每个log文件变得很小,从而方便阅读;

# 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'

        程序执行成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值