异常概述:异常是Java程序运行过程中出现的错误
异常分类:API查找Throwable
1.Error(服务器宕机,数据库崩溃等)
2.Exception C(异常的继承体系)API查RuntimeException
运行时异常:一般是程序员的错误异常可以让我们发现错误并修改
编译时异常:Exception下除了RuntimeException其他都是编译时异常 在写代码时就要处理掉 不然编译不通过
异常处理的两种方式
1.try catch(抓取)
try catch finally
2.throws(抛出) //直接抛给Jvm java虚拟机执行 缺点:程序会终止
try...catch处理异常的基本格式 try…catch…finally
通过 try{}carch(){} 把问题处理后程序会继续执行
- public static void main(String[] args) {
- try{
- int a=10;
- System.out.println(a/0);
- }catch(ArithmeticException e){
- //ArithmeticException类 中重写了Object中的toString()
- e=new ArithmeticException("不能除0");
- System.out.println(e);
- }finally{
- //这里的代码不管有没有抓取异常都会执行
- }
- //通过 try{}carch(){} 把问题处理后程序会继续执行
- System.out.println("出现异常行以下的程序-----------------------------------------");
- }
开发常用:
//打印堆栈信息 输出异常名字和问题的原因 以及问题出现在某个类中某一行
例:java.lang.ArrayIndexOutOfBoundsException: 7
at com.muzhou.lesson.exception.Demo02.main(Demo02.java:8) //异常代码位置
类中抛异常案例:
- public class Person {
- private String name;
- private int age;
-
- public Person() {
- }
-
- public Person(String name, int age) {
- 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 Exception {
- if(age>0&&age<=120){
- this.age = age;
- }else{
- //抛出异常
- /* try{
- throw new Exception();
- }catch( Exception e){
- e=new Exception("年龄非法");
- System.out.println(e);
- }*/
- throw new Exception();//不处理异常 再次往方法上抛出 使用场景:在数据库
- }
-
- }
-
- @Override
- public String toString() {
- return "Person{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
- Person p=new Person();
- p.setName("张三");
- try{
- p.setAge(130);//调用者被告知这个方法中有异常抛出 传值调用要注意 让调用者来处理
- }catch(Exception e){
- e.printStackTrace();
- }
- System.out.println(p);
- }
- public void setAge(int age) {
- if(age>0&&age<=120){
- this.age = age;
- }else{
- throw new RuntimeException("年龄非法");//运行异常 不需要手动处理 由jvm默认的异常处理机制处理
- }
- }
throw:在功能方法内部出现某种情况 程序不能继续运行 需要跳转时 就用throw把异常对象抛出
1.用在方法体内 跟的是异常对象
2.只能抛出一个异常对象名
3.表示抛出异常 由方法体内的语句处理
throws:
1.用在方法声明后面 跟的是异常类名
2.可以根多个异常类名 用逗号隔开
3.表示抛出异常 由该方法的调用者处理
自定义异常是给了异常名字 可以更好的识别异常解决问题
自定义异常继承Exception 继承自RuntimeException
- public class AgeException extends Exception{
- //自定义编译异常
- public AgeException() {
- super();
- }
- public AgeException(String s) {
- super(s);
- }
- }
- public class AgeRuntimeException extends RuntimeException{
- //自定义运行时异常
- public AgeRuntimeException() {
- super();
- }
- public AgeRuntimeException(String s) {
- super(s);
- }
- }
子类继承父类 不能抛出>父类的异常 只能抛出<=父类的异常
父类没有抛异常 子类不允许抛异常