什么是异常
非正常的情况
在程序运行过程中,发生的异常情况,导致程序意外终止的情况。
如何处理异常
在Java中,把异常信息封装程朗一个类,当出现了问题,就会创建异常类对象并抛出异常相关信息(如异常出现的位置、原因等)
1. 遇到异常,检查代码,修改代码,解决异常
2. 通过if判断,来解决代码中可能出现的异常。代码结构臃肿,不利于阅读和维护
3. Throwable类(Java语言中所有错误和异常的超类)
**error:**发生了错误,只能修改代码,不能使用异常处理机制来解决
exception: checked异常/编译异常:在java程序的编写过程中,发生的异常。代码会有红色波浪线
非checked异常/runtimeException:运行期异常,在java程序运行过程中,发生的异常
总结:runtimeException和它的子类都是运行异常,其他都是编译异常
常见异常处理机制有哪些
-
jvm默认有一套异常处理
JVM的处理方式只能打印出异常信息,不能个性化操作
JVM如何处理异常的
总结:当JVM处理异常的时候,异常之后的代码不会执行 -
使用try-catch:异常捕获(快捷键 alt+shift+R+z组合键)
try{
//可能会发生异常的代码
}catch(异常的类型 变量名){//Exception e
//处理异常的代码
//e.getMessage();打印异常信息
//e.printStackTrace();打印异常的堆栈信息:什么异常,异常常量
}
- 多重catch
try{
//可能发生异常的代码
}catch(异常类型1 变量名1){
//处理异常
}catch(异常类型2 变量名2){
//处理异常
}catch(异常类型3 变量名3){
//处理异常
}
特点:1、catch时有顺序的,先执行子类的匹配,再执行父类的匹配
2、catch一次只能执行一个
3、多重catch的变量名同名不影响
- try-catch-finally
finally:不管try-catch是否发生异常,都会输出finally中的内容
应用场景:IO流 :打开/关闭;连接数据的操作:打开连接/关闭连接
try{
//可能发生异常的代码
}catch(异常类型1 变量名1){
//处理异常
}catch(异常类型2 变量名2){
//处理异常
}catch(异常类型3 变量名3){
//处理异常
}finally{
//不管有没有异常都会执行
}
注:
1、如果try中的代码发生了return,如果程序正常执行,先执行return之前的,然后再执行finally中的
2、如果try中的代码发生了异常,先执行catch中的代码,然后执行finally中的代码,然后结束程序,发生异常的位置后面的代码不执行。
3、finally 在遇到程序强制结束退出(System.exit(0);)时,是不会发生的。
注:return一定是最后执行,fianlly不执行的唯一情况:system.exit(0);
- 声明异常throws
定义:告诉方法的调用者,该方法可能会发生异常,只是声明了异常,并没有处理。提醒调用者需要去处理异常。
//声明异常一定是写在方法()后
访问修饰符 返回值类型 方法名(形参列表)throws 异常类型{};
声明异常后,2种方式处理:
1、使用try-catch捕获异常
2、再继续throws,交给jvm处理
声明异常的方式:
1、throws+编译时异常:必须处理异常,否则程序报错
2、throws+运行时异常:调用者可以处理,也可以不处理
- Exception的所有的异常分类如何划分
运行时常见的异常
常见的编译的异常
**注:**如果调用方法的时候,方法出现红色波浪线,而且参数传递和方法名都没有问题,那么一定是编译异常 - 抛出异常throw
写在方法中,表示一定发生了异常,把该异常抛出,让调用者去处理该异常。
语法:throw new 异常类型(异常提示信息);
- throw和throws有何区别
1、定义不同:throw 异常对象/throws 异常类型
2、定义位置不同:throw 方法体中/throws 在方法列表后面
3、作用不同:throw 抛出异常/throws 声明异常,可能有也可能没有
package com.m.demo;
public class Person {
private String name;
private int age;
private char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws Exception {
if(age>=16&&age<=32) {
this.age = age;
}else {
throw new Exception("内容超出范围");
}
}
public char getSex() {
return sex;
}
public void setSex(char sex) throws Exception {
if(sex=='男'||sex=='女') {
this.sex = sex;
}else {
throw new Exception("输入不对");
}
}
}
class demo{
public static void main(String[] args) {
Person p=new Person();
try {
p.setAge(70);
} catch (Exception e) {
e.printStackTrace();
}
}
}
程序强制退出和return的区别
强制退出不会执行finally中的代码,return会执行
异常方法重写
1、如果父类定义了异常,那么子类可以定义,也可以定义部分,也可以不定义
2、如果父类不抛异常,那么子类也不可抛异常
3、子类抛异常范围不能比父类抛异常范围广
自定义异常
public class 自定义异常类名 extends Exception/ ...{
public 自定义异常类名(){
super();
}
public 自定义异常类名(String s){
super(String s);
}
}
Log4j日志的使用
- 导入Log4j的jar包
- 创建log4j的 配置文件:log4j.properties
- 创建log4j的对象(apache)
Logger logger=Logger.getLogger(Test.class);