学习目标:
1. 什么是异常
2. 怎么去触发异常并完成善后
3. 怎么在方法中触发异常
4. 怎么自定义异常
学习内容:
1.什么是异常
◆检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。
例如要打开-个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
◆运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在
编译时被忽略。
错误ERROR:错误不是异常, 而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,
当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
java已经定义好了异常类 throwable 方便使用
Error
Error往往代表致命性的错误,带来灾难和损失
Exception
Exception代表一些程序的逻辑错误,我们要从写代码的时候就要避免这些
关键字
try catch finally throw throws
finally 用于关闭资源, IO 做善后工作
throw 和 throws 不一样!!!
throw 在方法里抛出异常, 会终止当前方法
throws 在方法上抛出异常(不需要new对象), 不一定会终止当前方法, 可以保证整体程序继续运行
自定异常只需要继承Exception即可
2.怎么去触发异常
package com.exception;
public class demo01 {
public static void main(String[] args) {
int a = 1;
int b = 0;
//可以不要finally,但是在IO流资源关闭中经常用到
try{ //try 监控区域
if(b==0){
throw new ArithmeticException(); //主动抛出异常
}
// new demo01().a();
System.out.println(a/b);
// 被动抛出异常<捕获异常>
}catch(Error t){ //catch捕获想要的异常类型, 要从小到大的捕获// Throwable <error, exception>
System.out.println("程序出现error");
}catch(Exception f){
System.out.println("程序出现Exception");
}
catch(Throwable e){
System.out.println("程序出现Throwable");
}
finally{ // finally最后处理善后工作
System.out.println("finally");
}
}
public void a(){
b();
}
public void b(){
a();
}
}
- 怎么在方法中触发异常
package com.exception;
public class demo02 {
public static void main(String[] args) {
try {
new demo02().test(1,0);
} catch (Exception e) {
System.out.println("demo02 may throw a exception");
// e.printStackTrace(); // 打印错误信息
}
}
//假设这个方法中处理不了a和b。就用throws抛出这个异常
public void test(int a, int b) throws ArithmeticException{ // 方法上抛出异常
if(b==0){
System.out.println("throw a exception");
// System.exit(0);
throw new ArithmeticException(); //主动抛出异常。一般在方法中使用
}
System.out.println(a/b);
}
}
- 怎么自定义异常
package com.exception;
public class MyException extends Exception {
private int detail=0; //定义一个私有int变量
public MyException(int a){ // 有参构造方法
this.detail = a; //利用传入参数构造
}
@Override
public String toString(){//异常的打印信息,调用e的时候会自动调用这个方法toString()
return "MyException{" + this.detail +"}" ;
}
}
ppackage com.exception;
//自定义异常
public class demo03 {
public static void main(String[] args) {
try{
test(10);
}catch(MyException e){
System.out.println("MyException==>" + e); //方法先throws MyException==> + 方法内throw MyException{}
}
}
static void test(int a) throws MyException{
if(a>10){
throw new MyException(a);
}
System.out.println("OK");
}
}
//