Java--异常处理
Throwable:可抛出的,一切错误或异常的父类,位于java.lang 包中
——Error:JVM、硬件、执行逻辑错误,不能手动处理
——StackOverflowError :栈空间不足异常
——OutOfMemoryError :内存不足异常
——Exception:程序在运行和配置中产生的问题,可处理
——RuntimeException:运行时异常,可处理,可不处理
——CheckedException:检查时异常,必须处理
常见运行时异常
NullPointerException:空指针异常
ArrayIndexOutOfBoundsException :数组越界异常
ClassCastException:类型转换异常
NumberFormatException:数字格式化异常
ArithmeticException:算术异常
异常传递
按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理。
异常处理
Java的异常处理是通过5个关键字来实现的:
try:执行可能产生异常的代码
Catch:捕获异常,并处理
finally:无论是否发生异常,代码总能执行
throw:手动抛出异常
throws:声明方法可能要抛出的各种异常
异常处理形式
1、try{
可能出现异常的代码块
} catch(Execption e){
异常处理的相关代码 如:getMessage()、printStackTrace()
}
2、try{
可能出现异常的代码块
} catch(Execption e){
异常处理的相关代码 如:getMessage()、printStackTrace()
}finally{
是否发生异常都会执行,可以释放资源等..
}
(1)finally块是否发生异常都执行,可以释放资源
(2)finally块不执行的唯一情况,退出java虚拟机
3、try{
}catch(异常类型1){
}catch(异常类型2){
}catch(异常类型3){
}
(1)子类异常在前,父类异常在后
(2)发生异常时按顺序逐个匹配
(3)只执行第一个与异常类型匹配的catch语句
(4)finally根据需要可写可不写
4、try{
}finally{
}
try...finally 不能捕获异常,仅仅用来当发生异常时,用来释放资源
一般用在底层代码,只释放资源不做异常处理,把异常向上抛出
声明异常
throws:声明异常 修饰在方法参数的后端
谁调用谁就要处理异常或者声明异常,否则会报错
使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断
package com.monv.exception; import java.util.Scanner; /** * throws:声明异常 * @author Administrator * */ public class Demo { public static void main(String[] args) { try { divde(); } catch (Exception e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println(e.getMessage()); } } public static void divde() throws Exception { Scanner input = new Scanner(System.in); System.out.println("请输入第一个数字:"); int num1 = input.nextInt(); System.out.println("请输入第二个数字:"); int num2 = input.nextInt(); int result = num1/num2; System.err.println("结果为:"+result); } }
抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
throw关键字:抛出异常
语法:throw 异常对象
//1.处理方法1 public void setSex(String sex){ if (sex.equals("女")||sex.equals("男")){ this.sex = sex; } else { throw new RuntimeException("性别不符合要求"); } } public void setAge(int age) { if (age >0 && age<=120 ){ this.age = age; }else { //抛出异常 告知年龄输入错误 throw new RuntimeException("年龄不符合要求"); } } //2.处理方法2 声明异常 在程序编写调用的时候会知道要处理异常 public void setAge(int age) throws Exception{ if (age >0 && age<=120 ){ this.age = age; }else { //抛出异常 告知年龄输入错误 throw new Exception("年龄不符合要求"); } } public void setSex(String sex) throws Exception{ if (sex.equals("女")||sex.equals("男")){ this.sex = sex; } else { throw new Exception("性别不符合要求"); } }
自定义异常
需继承自Exception或Exception的子类,常用RuntimeException
必须提供的构造方法:
1、无参数构造方法
2、String message参数的构造方法
目的:使抛出的异常类型更加准确
带有异常声明的方法覆盖
子类中的方法,不能抛出比父类更多、更宽的异常