异常
1.异常
定义:java程序执行时出现的错误,会导致下面的java程序代码不会执行。
2.分类
Throwable为异常,子类Error和Excception,在Exception下又分为:RuntimeException和非RuntimeException
1.Error:错误
JVM内部错误,资源耗尽等严重情况。
主要分为:OutOfMemoryError:内存溢出
StackOverFlowError:栈溢出
2.Exception
a.运行时异常:RuntimeException
直接或间接继承RuntimeException,不需要显式处理
b.检查时异常:
直接继承类Exception,需要进行显式处理,例如使用下面语句进行异常处理
1.try{}catch{}
2.throws 异常名//抛出异常
3.异常处理
1.try-catch-finally
try语句件检查代码块是否有异常,如果有异常,则进入catch语句,finally语句无论是否出现异常都会执行,一个try可以有多个catch分支,就近原则(注:在书写catch语句时,异常类型必须从小到大)。该语句已经包括了异常的捕获和处理
2.throw/throws
两个都是属于抛出异常,并没有对异常进行处理,只是将产生的异常上抛给调用他的类。只是二者的使用方法不一样。
throw:抛出一个异常类创建的对象,用于方法内或代码块内
throws:抛出异常类,用于方法参数列表之后。
4.log4i
真正的项目在实际运行的时候,会有很多的异常,但是控制台不会输出所有的异常,进而无法对系统进行修正
解决:将所有的异常汇聚导一个文件中。
引入log4i.jar包,在src根目录下创建一个log4j.properties文件,
在log4j.properties中添加如下信息
# DEBUG\u8BBE\u7F6E\u8F93\u51FA\u65E5\u5FD7\u7EA7\u522B\uFF0C\u7531\u4E8E\u4E3ADEBUG\uFF0C\u6240\u4EE5ERROR\u3001WARN\u548CINFO \u7EA7\u522B\u65E5\u5FD7\u4FE1\u606F\u4E5F\u4F1A\u663E\u793A\u51FA\u6765
log4j.rootLogger=DEBUG,Console,RollingFile//控制报错信息输出到哪里。如果不需要输出到Console则只需将他删除即可。
#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u63A7\u5236\u53F0
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
#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u64CD\u4F5C\u7CFB\u7EDFD\u76D8\u6839\u76EE\u5F55\u4E0B\u7684log.log\u6587\u4EF6\u4E2D
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=G://Project//log.log //设置日志文件输出的位置
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
使用
public class Test1 {
private static Logger logger = Logger.getLogger(Test1.class);//建立logger变量
public static void main(String[] args) {
for(int i=0;;i++) {
try {
System.out.println(1/0);
} catch (Exception e) {
logger.debug(e.getMessage(),e);//输出异常信息
}
}
}
5.自定义异常类
背景
单纯的输出无法定义出现异常的位置,可以使用throw抛出一个异常对象。
throw + 异常对象
异常对象为自己所定义的异常,因为已有的异常无法满足日常开发的需要,因此针对所可能出现的异常进行创建类,输出提示信息。
步骤:
1.新定义类,继承已有的异常类
2.使用父类的构造方法放,传入提示信息
注意
1.如果自定义异常继承检查时异常类,则该自定义异常为检查时异常,如果继承运行时异常类,那么该自定义异常为运行时异常。
2.throw抛出的异常时运行时异常对象,不需要显式的使用throws和try-catch语句。如果自定义的异常类为非运行时异常,那么就需要显式解决,要么抛出该异常,要么使用try-catch语句进行包裹。
3.但是仅仅是抛出异常,没有进行处理,那么之后的代码都不会进行执行。但是如果在抛出异常处理后,那么之后的代码也就会被执行。
4.throw不能直接书写代码。
5.处理异常,如果已经在方法中对可能出现的异常已经进行了处理,那么就不会在抛出异常。