1、异常的定义:编程过程中出现的各种意料之外的事情
-
运行期间出现的错误,而不是编译时的语法错误
-
例如
一个不存在的文件夹
网络连接中断
操作数组越界等
2、层次结构
Throwable(Object的直接子类)
-
Error 特指应用程序在运行期间发生的严重错误,一般这种错误都是灾难性的
-
Exception(人为处理)
运行时异常:
可以通过debug调试解决
RuntimeException (可处理可不处理)--多数异常的基类
ArrayIndexOutOfBoundsException --数组越界异常
NullPointerException --试图访问null对象引用
ArithmeticException --整数除以0异常
unchecked exception
非检查性异常
编译时异常:
必须处理的
IOException --i/o异常的根类
SQLException --连接数据库的异常
ClassNotFountException --无法找到想要创建对象的类文件
checked exception
检查性异常 (不处理无法编译通过)
异常处理机制主要是处理 检查性异常
3、java 中可用于处理异常的两种方式:
-
自行处理
-
使用 try catch 处理异常
-
-
回避异常,自己不处理了,谁用 谁处理
-
使用throws 把 异常抛出
-
4、Java中处理异常的5个关键字
-
try{ ----------监视
//可能发生异常的代码
}catch( 异常的类型){ ----------捕获并处理try块抛出的异常
//负责处理异常
}finally{ ----------收尾
//收尾的工作
//关闭数据库链接
//关闭文件流
}
注意:
1)try要么和catch使用或者和finally使用
2)finally:不管是否有没有异常,都会执行
3)try中发生异常位置 后的代码不在执行了,进入catch处理
4) 如果catch 可以捕获try中的异常,则执行 catch中的内容
如果catch 不能捕获try中的异常,则程序终止
5)如果使用多重catch(
一定要先写子类在写父类,并且只执行一个catch)
子类写在父类的前面,而且只能执行其中的一个catch
可以直接使用Exception
注意:Exception类型的异常是所有异常类的父类,当有多个catch块是,该形参的catch块要放在最后面
使用try catch 处理异常的三种情况
1)
没有发生异常:
try中的内容完全执行,再执行后续的内容,而catch中的内容不会执行
2)
发生异常:
try 中发生异常位置后续的代码不在执行,进入catch,在执行后续的内容
3)
发生异常,但是catch无力捕获:
try中发生异常位置后续代码不执行,程序终止
示例:
package
lianxi01;
public class
Hello {
public static void
main(String[] args) {
try
{
System.
out
.println(
"1111111"
);
int
i=
20
/
2
;
/*
1111111
22222222
4444444*/
//inti=20/0;
/*
1111111
333333
4444444*/
System.
out
.println(
"22222222"
);
}
catch
(Exception ex){// NullPointerException
System.
out
.println(
"333333"
);
}
System.
out
.println(
"4444444"
);
}
}
finally 遇到 return 发生什么情况?
finally 在return之前执行
只有一种情况 finally是不会执行的;
在try或catch中包含 System.exit(0);
通常在finally语句中可以进行资源的清除操作,如关闭打开文件,删除临时文件
无论是否捕获异常,系统都会执行finally语句
示例:
package
lianxi01;
public class
he {
public static int
getReturn(){
try
{
int
i=
12
/
0
;
return
1
;
}
catch
(NullPointerException ex){
return
2
;
}
finally
{
return
3
;
}
}
public static void
main(String[] args) {
int
r=
getReturn
();
System.
out
.println(r);
}
}
所谓的异常处理:
就是在发生异常的时候记录发生异常的信息,保证程序可以继续进行
-
throws:抛出,只能放在方法的参数列表后面
访问修饰符 返回值类型 方法名(参数列表) throws 异常类型{
}
谁调用,谁处理
注意:
两个catch只能执行一个
-
throw语句:在程序执行过程中人为的引发异常
异常时通过关键字throw抛出,程序可以用throw语句引发明确的异常
throw new 异常的类型(“原因”);
如果 throw 引发的是编译时异常 那么必须使用throw 在方法上抛出
例如:
public void test(int age )
throws SQLException{
if
(age<
18
){
throw new
SQLException(
"年龄不足18岁"
);
}
}
如果 throw引发的是运行时异常,则可以不用throws
例如:
public void
setAge(
int
age){
if
(age<
18
){
throw new
RuntimeException(
"年龄不足18岁"
);
}
}
public void
div(
int
i,
int
j)
throws
Exception{
}
通常 使用throw 引发的异常 都是运行时异常
注意:在异常处理过程中,通过 异常处理 , 对用户操作进行提醒 并 记录异常的原因
log4j 工具的使用方式
a)添加log4j需要的jar文件到项目中
在.idea下新建一个lib包,直接复制粘贴log4j到该包下
并把jar添加到类路径(文件-项目-导入 Ctrl+alt+shift+S)
b ) 在 src 下创建名为log4j.properties 的资源文件
c ) 在资源文件中添加日志输出的配置
设置日志 的级别和输出的源(一般设置两个 一个控制台 一个文件)
日志的四个级别:
error>warn>info>debug
如果设置的级别为warn 那么 通过 info()和debug()方法写入的信息 无法记录
#设置日志记录的级别和输出源的名称
#注意 设置输出源名是 该名称必须存在
注意:语句后面无分号
log4j.rootLogger
=
debug,a,b
#设置每一个源的配置
#指定添加日志的方式
控制台追加
log4j.appender.a
=
org.apache.log4j.ConsoleAppender
#设置输出信息的目标
log4j.appender.a.Target
=
System.out
#设置输出信息的布局
log4j.appender.a.layout
=
org.apache.log4j.PatternLayout
#设置模板布局的格式
log4j.appender.a.layout.ConversionPattern
=
%d{yyyy-MM-dd HH:mm:ss} %c %l %M %m%n
文件追加
log4j.appender.b
=
org.apache.log4j.FileAppender
#指定文件的名称和位置
log4j.appender.b.File
=D:\\
test.log
log4j.appender.b.layout
=
org.apache.log4j.PatternLayout
log4j.appender.b.layout.ConversionPattern
=
%d{yyyy-MM-dd HH:mm:ss} %m%n
具体步骤:
#设置日志记录的级别,及需要的输出位置
log4j.rootLogger=debug,a,b
#设置输出源 a 的信息
#设置 a 使用的记录工具 控制台
log4j.appender.a=org.apache.log4j.ConsoleAppender
#使用System.out进行数据输出
log4j.appender.a.Target=System.out
#设置数据输出的格式的布局
log4j.appender.a.layout=org.apache.log4j.PatternLayout
#设置数据显示的模板 %d是日期 类 行 mothod方法 message信息 换行
log4j.appender.a.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c %l %M %m%n
#文件追加
log4j.appender.b=org.apache.log4j.FileAppender
#指定文件的名称和位置
log4j.appender.b.File=test.log
log4j.appender.b.layout=org.apache.log4j.PatternLayout
log4j.appender.b.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
了解
比较常用的
%d:表示日期
%c :表示异常的类名(记录日志的类)
%l:表示记录日志的位置
%M:记录异常的方法名
%m:表示日志的堆栈信息(详细信息)
%n:表示换行
%t:发生异常的线程名称
%p:记录日志的级别
d)在java类中使用日志工具 记录日常信息
注意:必须引入
org.apache.log4j.Logger;
-
在Java类中创建日志记录器的对象
-
private Logger log=Logger.getLogger(类名.class)
-
-
使用 Logger中的方法记录信息
-
log.error()
-
log.warn()
-
log.info()
-
log.debug()
-
log4j记录的内容 给谁看?
a) 运维,维护 人员
b)产品经理,了解该项目中那些模块使用的频率较高
c)可以通过日志 进行数据的恢复
1.异常
2.处理异常后,保证程序可以继续进行(做项目 一定要记录日志)