异常

java.lang.ArithmeticException:算术异常
java.util.InputMismatchException:输入不匹配
 java.lang.ArrayIndexOutOfBoundsException:数组下标越界


 异常(例外):程序在执行的过程中出现意外的情况,导致程序中断执行
 Java中的异常处理机制: try...catch...finally throws throw
try..catch..finally语法: 类比多重if...else if...else if...else条件结构记忆
try:保存的可能出现异常的代码
catch:处理异常的代码或消息;只有发生的异常与指定的异常类型相匹配时才会执行
try{
  //可能出现异常的代码
 }catch(异常类型 对象名){
  //处理异常的代码或消息
 }catch(异常类型2 对象名){
  //处理异常的代码或消息
 }....
 }finally{
  //不论异常是否发生都会执行的代码(释放资源)
 }

public class TestException1 {
    public static void main(String[] args) {
        /*
         *计算N个学员的总成绩和平均成绩 
         */
        int sum=0;//总成绩
        int avg=0;//平均成绩 
        System.out.println("请输入学员人数:");
        Scanner input = new Scanner(System.in);
        try{
            int num = input.nextInt();
            int[] scores = new int[num];//声明一个数组用于保存成绩  
            for(int i=0;i<num;i++){
                System.out.println("请输入第"+(i+1)+"个人的成绩:");
                scores[i]=input.nextInt();//将学员成绩保存到数组中
                sum+=scores[i];//计算总成绩
            }
            avg=sum/num;//平均成绩
        }catch(InputMismatchException  e){
            System.err.println("您输入的人数必须为数字,请重新输入!");
//            System.err.println(e.getStackTrace());//输出异常对象堆栈信息
            e.printStackTrace();//打印异常对象的堆栈信息
        }catch(ArithmeticException e){
            System.err.println("除数不能为零!");
            e.printStackTrace();
        }
        System.out.println("总成绩:"+sum+",平均成绩:"+avg);
    }
}

java.lang.Exception类:所有异常类(XxxxxException)的父类

public class TestException2 {
    public static void main(String[] args) {
        /*
         *计算N个学员的总成绩和平均成绩 
         */
        int sum=0;//总成绩
        int avg=0;//平均成绩 
        System.out.println("请输入学员人数:");
        Scanner input = new Scanner(System.in);
        try{
            int num = input.nextInt();
            int[] scores = new int[num];//声明一个数组用于保存成绩  
            for(int i=0;i<num;i++){
                System.out.println("请输入第"+(i+1)+"个人的成绩:");
                scores[i]=input.nextInt();//将学员成绩保存到数组中
                sum+=scores[i];//计算总成绩
            }
            avg=sum/num;//平均成绩
        }catch(Exception  e){
            System.err.println("程序出现了异常!");
//            System.err.println(e.getStackTrace());//输出异常对象堆栈信息
            e.printStackTrace();//打印异常对象的堆栈信息
        }
        System.out.println("总成绩:"+sum+",平均成绩:"+avg);
    }
}

catch:处理异常的代码或消息;只有发生的异常与指定的异常类型相匹配时才会执行
    只有当程序的异常被捕获并处理后,程序才能继续执行
  注意:如果有多个catch块,其中catch中的异常类型范围应该从小到大
  出现异常后,try块中尚未执行的语句不会执行
  出现异常后并处理后,catch块后面的语句还会执行

public class TestException3 {
    public static void main(String[] args) {
        /*
         *计算N个学员的总成绩和平均成绩 
         */
        int sum=0;//总成绩
        int avg=0;//平均成绩 
        System.out.println("请输入学员人数:");
        Scanner input = new Scanner(System.in);
        try{
            int num = input.nextInt();
            int[] scores = new int[num];//声明一个数组用于保存成绩  
            for(int i=0;i<num;i++){
                System.out.println("请输入第"+(i+1)+"个人的成绩:");
                scores[i]=input.nextInt();//将学员成绩保存到数组中
                sum+=scores[i];//计算总成绩
            }
            avg=sum/num;//平均成绩
        }catch(InputMismatchException  e){
            System.err.println("输入不匹配异常!");
            e.printStackTrace();//打印异常对象的堆栈信息
        }catch (Exception e) {
            System.err.println("程序出现了异常!");
            e.printStackTrace();
        }
        System.out.println("总成绩:"+sum+",平均成绩:"+avg);
    }
}
public class TryCatchDemo {
    public static void main(String[] args) {
        try{
            System.out.println("try....1");
            int num=10/0;
            System.out.println("try....2");
        }catch(InputMismatchException e){
            System.out.println("catch....");
            e.printStackTrace();
        }
        System.out.println("end.....");
    }
}

空指针异常:java.lang.NullPointerException
  产生原因:试图对空对象操作(访问空对象的属性或访问空对象的方法)
类找到异常:ClassNotFoundException
  产生原因:要加载的类无法找到

public class Student{
    String name;
    
    public void show(){
        System.out.println("姓名:"+name);
    }
    
    public static void main(String[] args) {
        Student stu=null;
//        stu.name="张三";
        try{
//            stu.show();
            Class.forName("java.lang2.String");//加载指定的类
            
        }catch(NullPointerException  e){
            System.err.println("对象不能null,请对对象进行创建!");
        }catch(ClassNotFoundException e){
            System.err.println("类找到异常,请检查全类名!");
        }
        System.out.println("end....");
    }
}

try{

  }catch(异常类型 对象名){

  }....
  }finally{
    //总是会被执行的代码
  }
finally中代码总是会被执行,它执行在return之前。
  只有一种情况finally中的代码才不会执行:调用System.exit(1):终止正在运行的JVM
  通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

public class TryCatchFinally {
    public static void main(String[] args) {
        //情况1
//        try {
//            System.out.println("try....1");
//            int num=10/0;
//            System.out.println("try....2");
//        } catch (Exception e) {
//            System.out.println("catch....");
//        }finally{
//            System.out.println("finally....");
//        }
//        System.out.println("end....");
        //情况2
//        try {
//            System.out.println("try....1");
//            int num=10/0;
//            System.out.println("try....2");
//        } catch (ClassCastException e) {
//            System.out.println("catch....");
//        }finally{
//            System.out.println("finally....");
//        }
//        System.out.println("end....");
    //情况3    
//        try{
//            System.out.println("try....");
//            int num=10/0;
//            System.out.println("try....2");
//        }finally{
//            System.out.println("finally....");
//        }
//        System.out.println("end...");
        
        //面试题:
        try{
            System.out.println("begin....1");
            int a=10;
            int b=0;
            System.exit(1);//终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
            int c=a/b;
            System.out.println("begin....2");
//            return;
        }catch(Exception e){
            System.out.println("catch....");
        }finally{
            System.out.println("finally....");
        }
        
        System.out.println("----------------------");
        try{
            int a=10;
            System.out.println("try...a="+a);
            return;
        }finally{
            System.out.println("finally...");
        }
    }
}

finall遇到return关键字,先执行finally中的代码。

public class TryFianlly {
    public static int test(){
        try{
            return 1;
        }finally{
            return 2;
        }
    }
    public static void main(String[] args) {
        int a = test();
        System.out.println("a="+a);
        try {
            Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

throws:声明方法时,定义该方法抛出的异常类型。谁调用谁处理。
语法:
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2....{

}
throw:在方法中抛出异常对象,throw关键字后边跟的异常对象,调用者可以继续对所抛出的异常进行处理
throws和throw的区别:
  1.位置不同:
    throws在方法声明时
    throw在方法体中
  2.类型和个数不同
    throws后跟的是异常类型,可以是多个
    throw后跟的是异常对象,一个
  3.作用不同
    throws声明方法是抛出异常,告知调用者方法中存在异常的风险
    throw是方法处理过程中将异常对象抛出,调用者可以进一步对异常对象进行处理

public class ThrowsDemo {
    public void test() throws ClassNotFoundException{
        try{
            Class.forName("java.lang.Scanner");
        }catch(ClassNotFoundException e){
            System.err.println("无法加载指定的类...1");
        }
    }
    
    public void test2() throws ClassNotFoundException{
        try{
            Class.forName("java.lang.Scanner");
        }catch(ClassNotFoundException e){
            System.err.println("无法加载指定的类...");
            throw e;//抛出异常
        }
    }
    
    
    public static void main(String[] args) {
        ThrowsDemo throwsDemo = new ThrowsDemo();
        try{
            throwsDemo.test2();
        }catch(ClassNotFoundException e){
            System.err.println("无法加载指定的类2...");
        }
    }
    
}


自定义异常:
  1. 编写一个Exception或RuntimeException的子类
  2. 提供两个构造函数:无参和有参

public class SexException extends Exception{
    public SexException(){
        
    }
    public SexException(String message){
        super(message);
    }
    @Override
    public String toString() {
        //super.getMessage():获取父类中的异常消息
        return "SexException ["+super.getMessage()+"]";
    }
    
}

捕获异常的快捷键:
  1.选中检查异常的代码
  2.shift+alt+z

public class Student {
    private String name;
    private String sex;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    /**
     * 通过自定义异常完成性别的检测
     * @param sex
     * @throws SexException
     */
    public void setSex(String sex) throws SexException {
        if(sex.equals("男")||sex.equals("女")){
            this.sex = sex;
        }else{
            throw new SexException("性别只能是男或女!");
        }
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    public void show(){
        System.out.println("姓名:"+name);
        System.out.println("性别:"+sex);
        System.out.println("年龄:"+age);
    }
    
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("zhangsan");
        student.setAge(20);
        try {
            student.setSex("男女男");
        } catch (SexException e) {
            System.err.println(e.getMessage());//获取异常消息
            e.printStackTrace();
        }
        student.show();
        
    }
    
}
原文地址:https://www.cnblogs.com/fwdsz/p/6792371.html