异常

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  阅读(237)  评论(0)    收藏  举报