java中的异常及其处理

java异常处理

异常类有两个直接子类:Exception类 Error类

Exception类时所有异常类的父类

错误

java虚拟机无法解决的严重问题

error发生在jvm中 比如栈满StackOverflowError

异常

Exception 异常

运行时异常 直接或者间接继承RuntimeException

​ 在编译期不强制要求处理

编译时异常

直接或间接继承Exception与RuntimeException没有关系

在编译期间强制要求处理,否则不能编译.

常见异常

数组越界

异常提示 ArrayIndexOutOfBoundsException

int [] a=new int[5];
      a[5]=10;

空指针异常

异常提示 NullPointerException

 String a=null;
        System.out.println(a.length());

类型转换异常

异常提示 ClassCastException

Object a ="abc";
        Integer b=(Integer)a;

数字格式化异常

异常提示 NumberFormatException

new Integer("abc");

算数异常

异常提示 ArithmeticException

int a=19;
        int b=0;
        System.out.println(a/b)

异常处理

java异常处理是通过5个关键字来实现的:try catch finally throw throws

捕获异常

try{

可能会出现的异常的代码

任何语句发生异常,下面的代码不会被执行,程序将跳转到异常处理代码块中

}catch(异常类型 ){

处理异常的代码

getMessage()获取异常信息,返回字符串

printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。

}finally{

无论是否出现异常,finally块的代码都会执行

}

try+finally 语句块 没有处理 如果有异常 代码执行到finally就会终止

在catch语句中异常大的放在下面

package com.lsy.javaException.day2;

public class Demo1 {
     
    public static void main(String[] args) {
     
        int []a = new int[3];

        try{
     
            a[3]=10;
            System.out.println(a[3]);

        } catch(Exception e){
     
            e.printStackTrace();//打印信息到控制端
            System.out.println("数组越界");
        }
    }
}

try+catch+finally 执行顺序 (无return)1.try 2.catch 3.finally

有return情况下 先执行finally

package com.lsy.javaException.day2;

public class Demo2_3 {
     
    public int test(int a,int b){
     
     /*   int c; 这里对c没有赋值
        try{
            c=a/b;这里进行对c的初始化
        }catch (Exception e){
            System.out.println();
        }finally {

        }
        return c; 这里报错的原因是c的初始化在try中,如果出现异常对c不进行赋值*/
        /*
        当try和catch中有return时 程序先执行finally

         */
        try{
     
            return a/b;
        }catch (Exception e){
     
            return -1;
        }finally {
     
            System.out.println("aaaaaaaa");
        }

    }
    public static void main(String[] args) {
     

        Demo2_3 a = new Demo2_3();
        System.out.println(a.test(10,0));
    }
}

声明异常

throws是声明方法可能要抛出的各种异常 表示此方法不处理异常,而交给方法调用处进行处理

任何方法都可以使用throws关键字声明异常类型,包括抽象方法

子类重写父类的方法,子类方法不能声明比父类类型更大的异常(针对编译器异常)

使用throws的方法,调用时必须处理声明的异常,要么使用try-catch要么继续抛出

抛出异常

throw关键字用于方法体中,用来抛出的是一个异常对象
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。

throw new 异常类构造方法

package com.lsy.javaException.day2;

public class Demo6_1 {
     
    public String ScoreCheck(int score) throws Exception{
     
        if(score<0||score>100){
     
            throw new Exception("成绩不合法");
        }
        if(score>90){
     
            return "优秀";
        }
        else {
     
            return "不优秀";
        }
    }
    public static void main(String[] args) {
     
      Demo6_1 demo6_1 = new Demo6_1();
      try{
     
          demo6_1.ScoreCheck(101);
      }catch (Exception x){
     
        x.printStackTrace();
      }

    }
}

自定义异常

自定义异常时自己定义的异常类,就是api中的标准异常类的直接或间接的子类

作用:用自定义异常标记业务逻辑的异常

基本语法

public class 异常类名 extends Exception/RuntimeException{

public 异常类名(String message){

super(message)

}

}

package com.lsy.javaException.day2;

public class scorecheckException extends Exception {
     
    /*
    根据需要,自定义异常
     */
    public scorecheckException(String message){
     
        super(message);
    }
}

package com.lsy.javaException.day2;
/*
自定义异常
 */
public class Demo6_2 {
     
    public String ScoreCheck(int score) throws scorecheckException{
     
        if(score<0||score>100){
     
            throw new scorecheckException("成绩不合法");
        }
        if(score>90){
     
            return "优秀";
        }
        else {
     
            return "不优秀";
        }
    }
    public static void main(String[] args) {
     
      Demo6_2 demo6_1 = new Demo6_2();
      try{
     
          demo6_1.ScoreCheck(101);
      }catch (scorecheckException x){
     
        x.printStackTrace();
      }

    }
}

你可能感兴趣的:(java)