概述
异常的体系
Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来, Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它。
Exception:叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的孩子来封装程序出现的问题。
●运行时异常: RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)
●编译时异常:编译阶段就会出现错误提醒的。(如:日期解析异常)
抛出异常
●在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
捕获异常
●用 try...catch 直接捕获程序出现的异常。
自定义异常
Java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。
自定义运行时异常
- 定义一个异常类继承RuntimeException。(必须让这个类继承自RuntimeException,才能成为一个运行时异常类。)
- 重写构造器。
- 通过throw new异常类(xx)来创建异常对象并抛出。
- 编译阶段不报错,提醒不强烈,运行时才可能出现。
自定义编译时异常
- 定义一个异常类继承Exception。
- 重写构造器。
- 通过throw new异常类(xxx)来创建异常对象并抛出。
- 编译阶段就报错,提醒更加强烈!
自定义异常的作用
- 异常是用来查寻系统Bug的关键参考信息。
- 异常可以作为方法内部的一种特殊返回值,以便通知上层调用者底层的执行情况。
异常的处理
开发中对于异常的常见处理方式
1.捕获异常,记录异常并响应合适的信息给用户。
public cLass ExceptionTest {
public static void main(String[] args) {
try {
test1();
} catch (Exception e) {
System.out.println("您当前操作有问题");
e.printStackTrace(); //打印出这个异常对象的信息。记录下来。
}
}
public static void test1() throws Exception {
SimpleDateFormat sdf = new SimpLeDateFormat("yyyy-MM-dd HH:mm:ss"
Date d = sdf.parse("2028-11-11 10:24:11");
System.out.println(d) ;
test2();
}
public static void test2() throws Exception {
//读取文件。
InputStream is = new FileInputStream("D:/DoNotHave.png");
}
}
2.捕获异常,尝试重新修复。
import java.util.Scanner;
public class Time {
public static void main(String[] args) {
while (true) {
try {
System.out.println(num());
return;
} catch (Exception e) {
System.out.println("请输入数字");
}
}
}
public static double num() throws Exception{
Scanner sc = new Scanner(System.in);
double a;
while (true) {
a = sc.nextDouble();
if (a >=0) {
return a;
}else {
System.out.println("请输入不小于0的数");
}
}
}
}