异常
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("分数正常");
}
}
}


浙公网安备 33010602011771号