异常

1.异常处理

对于代码在执行过程中的异常,通常使用 try{...}catch{...}finally{...} 或者 throws语句对异常进行处理。

  • throws 和 throw 的区别:
throws throw
用在方法声明后面,抛出异常类名;表示抛出异常,谁调用谁处理;表示出现异常的一种可能性,不一定发生异常 用在方法体内,跟的是异常对象名;表示抛出异常,由方法体内的语句处理;执行throw一定抛出了某种异常
public class ExceptionDemo2 {
/*
    public  String getMessage():返回此throwable的详细消息字符串
    public String toString():返回此可抛出的简短描述
    public void printStackTrace():把异常的错误信息输出在控制台
*/
    public static void main(String[] args) {
        System.out.println("start:");
        method();
        System.out.println("end");

    }
    public static void method()
    {
        try {
            int[] arr= new int[]{1, 2, 3};
            System.out.println(arr[3]);
        } catch (Exception e) {
            e.printStackTrace(); /*将异常信息在控制台输出
        java.lang.ArrayIndexOutOfBoundsException: 3
            at exceptiontest.ExceptionDemo2.method(ExceptionDemo2.java:19)
            at exceptiontest.ExceptionDemo2.main(ExceptionDemo2.java:11)
            */
            System.out.println(e.getMessage());
//            输出结果:3
            System.out.println(e.toString());
//           输出结果:java.lang.ArrayIndexOutOfBoundsException: 3
        }finally {
            System.out.println("最终执行了finally语句块中的代码");
        }
    }

}

public String getMessage(): 返回此throwable的详细消息字符串
public String toString(): 返回此可抛出的简短描述
public void printStackTrace(): 把异常的错误信息输出在控制台
执行以上代码:程序输出结果如图:

2.Java中的异常分类:

编译时异常和运行时异常,也被称为受检异常和非受检异常
所有的RuntimeException类及其子类的实例被称为运行时异常,其他异常都是编译时异常。

  • 编译时异常/受检异常:必须显示处理,否者无法通过编译

  • 运行时异常/非受检异常:无需显示处理,也可以和编译时异常一样处理。
    编译时异常是指在代码编写过程中直接提示的异常,不解决该异常,程序无法开始运行;而运行时异常则是指代码通过编译,在实际运行过程中,出现的异常,最简单的例子:数组越界。运行时异常通常是在运行报错之后添加try...catch...语句。

      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
    
      public class ExceptionDemo2 {
      /*
          public  String getMessage():返回此throwable的详细消息字符串
          public String toString():返回此可抛出的简短描述
          public void printStackTrace():把异常的错误信息输出在控制台
      */
          public static void main(String[] args) {
      //        System.out.println("start:");
      start        method();
              method2();
      //        System.out.println("end");
    
          }
          //RunTimeException,运行时异常
          public static void method()
          {
              try {
                  int[] arr= new int[]{1, 2, 3};
                  System.out.println(arr[3]);
              } catch (Exception e) {
                  e.printStackTrace(); /*将异常信息在控制台输出
              java.lang.ArrayIndexOutOfBoundsException: 3
                  at exceptiontest.ExceptionDemo2.method(ExceptionDemo2.java:19)
                  at exceptiontest.ExceptionDemo2.main(ExceptionDemo2.java:11)
                  */
                  System.out.println(e.getMessage());
      //            输出结果:3
                  System.out.println(e.toString());
      //           输出结果:java.lang.ArrayIndexOutOfBoundsException: 3
              }finally {
                  System.out.println("最终执行了finally语句块中的代码");
              }
    
          }
    
          //Excption编译时异常
          public static void method2() {
              try {
                  String s = "2021-12-11";
                  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                  Date d = sdf.parse(s); //这里如果不使用try...catch...处理异常,程序无法执行
      //        java: 未报告的异常错误java.text.ParseException; 必须对其进行捕获或声明以便抛出
                  System.out.println(d);
              }catch (ParseException e)
              {
                  e.printStackTrace();
              }
          }
    
      }
    

3.自定义异常

ScoreException.Java

public class ScoreException extends  Exception{
    public  ScoreException() {}

    public  ScoreException(String message){
        super(message);
    }

}

Teacher.Java

import java.util.Scanner;

public class Teacher {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入分数:");
        int score =sc.nextInt();
        Teacher t=new Teacher();
        try {
            t.checkScore(score);
        } catch (ScoreException e) {
            e.printStackTrace();
        }
    }


    public  void  checkScore(int score) throws ScoreException {
        if (score<0||score>150){
            throw  new ScoreException();
        }else {
            System.out.println("分数正常");
        }
    }
}
posted @ 2022-04-12 00:31  hanqi  阅读(216)  评论(0)    收藏  举报