JAVA学习心得——异常处理try、catch、finally用法

要了解try、catch、finally的用法,首先了解什么是异常。
异常就是代码出现了问题,不同寻常的意思。
java语言把程序运行过程中所发生的不正常严重错误成为异常。

异常的结构:

异常也是有子类父类之分的。Throwable是两类Exception、Error的父类。Exception是RuntimeException的父类。如下图很是明显。
在这里插入图片描述在此给出两个用法:

Throwable的常用用法:
public String getMessage():获取异常信息;
public voidprintStackTrace():输出异常堆栈中的异常信息

Exception构造方法:
public Exception():无参构造方法;
public Exception(Stringmessage):可以指定详细异常信息的有参构造方法;

异常分类:

①、运行时异常:可以不显式对异常的处理,javac依旧可以进行编译操作。
②、检查时异常:必须显式对异常的处理,不然javac不会对程序编译。

运行时异常:尚未报错javac依旧可以进行编译,运行。

public class Test {
  	public static void main(String[] args) {
  	System.out.println(111);
   	System.out.println(1/0);//运行时异常
 	System.out.println(222);
   	}
}

在这里插入图片描述

运行结果如下,所以不难发现,如果程序异常那么同级代码不再运行。

检查时异常:已经报错,不处理无法编译。
在这里插入图片描述

异常的处理:

异常的处理方式有两种:
①、通过try、catch和finally关键字捕获异常
②、通过throw、throws关键字抛出异常(在下一篇博客会详述)

try、catch
如果一个语句出现异常我们可以通过try catch来尝试和抓取,让程序继续进行下去,并且在控制台上显示错误原因。

public class Test {
	public static void main(String[] args) {
		System.out.println(111);
		try {
			System.out.println(1/0);//运行时异常
		} catch (Exception e) {
       			e.printStackTrace();
       		 }
        System.out.println(222); 
	}
}

进行try catch后程序即可运行,结果如下:在这里插入图片描述
①、一个try中可以套用多个catch但是在捕捉到第一错误时,下面的catch就会自动失效。
在这里插入图片描述
程序运行结果是:

只运行了第一个catch,第二catch直接被跳过了。

在这里插入图片描述
②、try不能单独使用。在这里插入图片描述


finally:无论try中是否有异常发生,finlly中的代码总会执行,一般用于释放资源。

public class Test {
     public static void main(String[] args) {
    	 System.out.println(111);
 	 try {
     		System.out.println(1/0);//运行时异常
     	 } catch (Exception e) {
            e.printStackTrace();
          }finally{
          System.out.println("333");
          }
      	System.out.println(222); 
     }
}

如果异常太多,在控制台上难以准确定位造成无法寻找bug,所以需要使用log4j将异常信息输入在一个文件中。
如何操作那?
1、导入log4j-1.2.15.jar依赖包
2、在src根目录下创建名为log4j.properties的文件

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 

3、在src下创建Test类

import org.apache.log4j.Logger; 
public class Test { 
 	 privatestatic final Logger logger = Logger.getLogger(Test.class);
         publicstatic void main(String[] args) { 
                   try{ 
                            Class.forName("ErrorClassName");
                   }
	 catch (ClassNotFoundException e) { 
                            logger.debug(e.getMessage(),e);//详细日报信息 
                            logger.info(e.getMessage(),e);//详细日报信息 
                            logger.warn(e.getMessage());//简单日报信息 
                            logger.error(e.getMessage());//简单日报信息 
                   }

   } 
} 

4、运行程序:在D盘根目录中log.log文件中可以找到生成的文件。
文件过大可以使用间歇性输出文件。
只需要改动log4j.properties的代码,具体如下:

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'

可以通过改动代码最后一行,控制单个文件收集时间,方便后观察。
DatePattern选项的有效值为:
'.'yyyy-MM,对应monthly(每月)
'.'yyyy-ww,对应weekly(每周)
'.'yyyy-MM-dd,对应daily(每天)
'.'yyyy-MM-dd-a,对应half-daily(每半天)
'.'yyyy-MM-dd-HH,对应hourly(每小时)
'.‘yyyy-MM-dd-HH-mm,对应minutely(每分钟)
DatePattern中不用处理的文字要放到单引号(’)中,如上面的(.)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值