异常
java程序运行过程中出现的问题。
异常有 Throwable Error Exception
异常的继承体系
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
Throwable 魔界首领
Error
Exception
runtimeException
JVM默认是如何处理异常的
异常分为三种:系统错误,异常和运行时异常。
系统异常(system error) 是由Java虚拟机抛出,用error类表现。(我们程序员的错误,ide一般会帮我们解决)
异常(exception)是描述程序和外部环境引起的错误,一般被捕捉和处理。
运行时异常(runtime Exception)设计错误,如数组越界、空指针等。
- JVM默认是如何处理异常的
- main函数收到这个问题时,有两种处理方式:
- 自己将该问题处理,然后继续运行
- 自己没有针对的处理方式,只有交给调用main的jvm来处理
- jvm有一个默认的异常处理机制,就将该异常进行处理.
- 并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行
- main函数收到这个问题时,有两种处理方式:
处理异常
- try catch finally 方式
try catch
try catch finally
try finally
finall一般是为了关闭资源存在的。 - throws方式
try catch 用法
try{
XXXXX
}catch(RuntimeExcetpion e){
xxxxx
}catch(Excetption e){
xxxxx
}
//注意:顺序不可颠倒,Exception 可捕获所有异常
这里有一个考点:
finally运行吗?
//finally 在不遇到 system.exit(0),强制关机等意外情况时 不运行 其他情况都运行
int b=3;
int c = 0;
try{
int a = b/c;
}catch(Excetion e){
System.out.println("异常找到了");
return b;//运行到这里时,先将return b保存起来(临时存放),寻找finally 并运行 但它的运行不影响catch的返回值。
}finally{
b++;// 运行后 b = 4;
//return 2; 如果finally中有return,那么会覆盖掉上面的return(不推荐)
}
异常的分类
运行时异常 RuntimeException类
这个类及其子类都是程序运行出来时,的错误,比如 NullPointerException、ArrayIndexOutOfBoundsException等
而其他的异常是我们没有编译时异常,在Eclipse中会编译不让通过的。
Throwable 常用的方法
getMessage()
获取异常信息,返回字符串
toString()
获取异常类名和异常信息,返回字符串
printStackTrace()//默认调用
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
throws 处理异常
- 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
- 那么就通过throws在方法上标识。
throw的概述以及和throws的区别
- throw的概述
- 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
/**
* throws的方式处理异常
* 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
* 那么就通过throws在方法上标识。
* 案例演示
* 举例分别演示编译时异常和运行时异常的抛出
* 编译时异常的抛出必须对其进行处理
* 运行时异常的抛出可以处理也可以不处理
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setAge(-17);
System.out.println(p.getAge());
}
class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeOutOfBoundsException {
if(age >0 && age <= 150) {
this.age = age;
}else {
//Exception e = new Exception("年龄非法");
//throw e;
throw new AgeOutOfBoundsException("年龄非法");
}
}
}
/**
* try...catch的方式处理多个异常
* JDK7以后处理多个异常的方式及注意事项
*
* 安卓,客户端开发,如何处理异常?try{}catch(Exception e){}
* ee,服务端开发,一般都是底层开发,从底层向上抛
*
* try后面如果跟多个catch,那么小的异常放前面,大的异常放后面,根据多态的原理,如果大的放前面,就会将所有的子类对象接收
* 后面的catch就没有意义了
*/
public static void main(String[] args) {
//demo1();
int a = 10;
int b = 0;
int[] arr = {11,22,33,44,55};
//JDK7如何处理多个异常
try {
System.out.println(a / b);
System.out.println(arr[10]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("出错了");
}
}
public static void demo1() {
int a = 10;
int b = 0;
int[] arr = {11,22,33,44,55};
try {
System.out.println(a / b);
System.out.println(arr[10]);
arr = null;
System.out.println(arr[0]);
} catch (ArithmeticException e) {
System.out.println("除数不能为零");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("索引越界了");
} catch (Exception e) { //Exception e = new NullPointerException();
System.out.println("出错了");
}
System.out.println("over");
}
- throws和throw的区别
- throws
- 用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者来处理
- throw
- 用在方法体内,跟的是异常对象名
- 只能抛出一个异常对象名
- 表示抛出异常,由方法体内的语句处理
- throws
注意点
- 异常注意事项
- 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
- 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
- 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
- 如何使用异常处理
-
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
-
区别:
- 后续程序需要继续运行就try
- 后续程序不需要继续运行就throws
-
如果JDK没有提供对应的异常,需要自定义异常。
-