1、异常概述
程序在运行都有可能发生异常(逻辑问题)。
捕获错误最理想的是在编译期间(编译器提示),但有的也发生在运行期间。
异常处理方式:
1、不处理
2、程序开发时对有可能出现的错误进行处理
异常的分类:
1、Error :错误,JVM内部的错误——内存不足,栈、堆异常等
2、Exception : 异常,因程序逻辑导致——空指针异常,数组索引越界,类型转换异常等
常见异常:
1、空指针异常:NullPointerException
2、数组索引越界异常:ArrayIndexOfException
3、类型转换异常:ClassCastExecption
4、运算异常:ArithmeticExecption
异常类Throwable的层次结构:
2、异常处理机制
1、抓抛模型
如果程序在运行的时候出现异常,jvm会自动的创建一个异常对象,并对外抛出异常。
程序员可以通过程序设计来对异常进行捕获,并进行处理
try {
// 可能出现错误的代码
// 1.只要产生了异常,当前try代码中剩余的代码就不会执行了
// 2.一个try块,可以对应多个catch块,每一个catch对一种异常进行捕获
// 3.我们try块中,如果有多个不同的异常,我们可以使用异常的父类Exception
} catch (Exception e) {
// 捕获异常的代码
// 1.catch可以有0个或多个
// 2.如果有多个catch的时候,需要我们注意 异常要从小到大进行捕获,平级之间顺序无所谓
e.printStackTrace();
} finally {
// 程序一定会执行的地方,一般放置一些必须要执行的代码,例如:JDBC中关闭资源连接的代码
// 特殊情况: 虚拟机(JVM),意外终止——System.exit(0),那么finally中的将不会执行!!
}
catch块中常见的方法:
1.void printStackTrace(): 向控制台去输出信息
2.String getMessage(): 返回一个字符串,用来表示你异常的信息
public class Main {
public static void main(String[] args) {
//'catch' or 'finally' expected
try {
String s=null;
System.out.println("Hello world!1");
//System.exit(0);
System.out.println("====>"+(s.length()));
System.out.println("====>"+(3/0));
System.out.println("Hello world!2");
}catch (NullPointerException e){
System.out.println("进入了处理====>NullPointerException");
String message = e.getMessage();
System.out.println("message===>"+message);
e.printStackTrace();
}catch (Exception e){
//Exception 'java.lang.NullPointerException' has already been caught
System.out.println("进入了处理===>NullPointerException");
e.printStackTrace();
}finally {
System.out.println("Hello world!3");
System.out.println("Hello world!4");
}
}
}
2、声明模型 throws—只能在方法名后面使用
public 返回值类型 方法名 throws 异常类名称(参数列表){
//我们执行的代码
}
public void test() throws Exception{
int a=3;
int b=0;
System.out.println(a/b);
}
1.如果方法能正常运行,会返回一个结果
2.不能正常运行,会抛出对应异常
throw:配合throws一起使用
public class Person {
public void test() throws Exception{
int a=3;
int b=0;
if(b==0){
throw new Exception("b不能为0");
}
System.out.println(a/b);
}
public static void main(String[] args) throws Exception {
Person person = new Person();
person.test();
}
}
3、throws 和 throw的区别
1.throws
1.声明一个方法的可能产生的所有的异常
2.方法声明的后面,跟的是异常类的名称,可以后面跟多个异常类名称,使用‘,’隔开
3.表示是抛出异常,谁用谁处理
4.可能会出现异常,并不一定会发生异常!!!
2.throw---手动抛出一个异常对象---为我们下面学习自定义异常准备的!!!!
1.抛出一个具体的异常
2.在方法的内部使用,跟的是异常对象
3.执行表示一定会抛出某个具体的异常对象(不需要别人处理)
4、自定义异常类
1.创建一个类
2.让这个类继承Execption或Execption的子类
3.编写一个构造方法,为ThrowAble中的属性 detailMessage 进行赋值
public class MyExecption extends Exception{
public MyExecption(String s) {
super(s);
}
}
public class MyTest {
public void test() throws Exception{
int a = 3;
String str = "";
if(str==null){
throw new MyExecption("str 是null了 ");//我们自己定义的异常类
}
}
public static void main(String[] args) throws Exception {
MyTest myTest =new MyTest();
myTest.test();
}
}