Java 异常
1. 异常
(1) 异常就是代表程序出现的问题
(2) 异常的体系:
(3) Error:代表的是系统级别的错误,系统一旦出现问题,sun公司会把这些问题封装成Error对象,Error是sun公司自己用的,开发人员可以不用管它。
(4) Exception:异常,代表的是程序可能出现的问题,程序员通常会使用Exception以及他的子类来封装程序出现的问题
(5) RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常
(6) 编译时异常:编译阶段就会出现错误提醒
public static void main(String[] args) throws ParseException {
//异常
//运行异常
int a = Integer.valueOf("1a2");
System.out.println(a);//java.lang.NumberFormatException
int[] arr = {1,2,3,4,5};
System.out.println(arr[6]); // java.lang.ArrayIndexOutOfBoundsException
//编译异常
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//sdf.parse("2024-12-23 22:22:22");//ParseException
//1.使用try catch抓获
try {
sdf.parse("2024-12-23 22:22:22");//ParseException //使用try catch抓获
} catch (ParseException e) {
throw new RuntimeException(e);
}
//2. 使用 throws ParseException 将异常抛出
sdf.parse("2024-12-23 22:22:22");
}
2. 抛出异常 throws
(1) throws:在方法上使用throws关键字,可以将方法内部出现的异常抛出去给其调用者
(2) 格式:方法 throws 异常1, 异常2,异常3,...{ };推荐使用 方法 throws Exception{ }; Exception为所有异常的父类
3. 捕获异常 try-catch
(1) try-catch:直接捕获程序出现的异常
(2) 格式:
try{
//监视可能出现的异常
}catch( 异常类型1 变量){
//处理异常
}catch( 异常类型2 变量){
//处理异常
}...
4. 自定义异常
(1) Java 无法为全部的问题都提供异常类来代表,如果自己的某种业务问题想通过异常来表示,以便用异常来管理该问题,就需要自己定义异常
(2) 自定义异常的种类
① 自定义运行异常:定义一个异常类继承RuntimeException;重写构造器;通过throw new 异常类(xxx) 对象并抛出,编译阶段不报错,提醒不强烈,运行时才可能抛出;
② 自定义编译异常:定义一个异常类Exception;重写构造器;通过throws new异常类(xxx)来创建异常对象并抛出,编译阶段就报错,提醒更加强烈;
//自定义运行异常 继承RuntimeException
public class ExceptionTest1 extends RuntimeException{
//重写无参构造器
public ExceptionTest1() {
}
//重写String message有参构造器
public ExceptionTest1(String message) {
super(message);
}
}
//自定义编译异常 继承RuntimeException
public class ExceptionTest2 extends Exception{
//重写无参构造器
public ExceptionTest2() {
}
//重写String message有参构造器
public ExceptionTest2(String message) {
super(message);
}
}
public class Test {
public static void main(String[] args) throws ParseException {
//异常
//运行异常
int a = Integer.valueOf("1a2");
System.out.println(a);//java.lang.NumberFormatException
int[] arr = {1,2,3,4,5};
System.out.println(arr[6]); // java.lang.ArrayIndexOutOfBoundsException
//编译异常
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//sdf.parse("2024-12-23 22:22:22");//ParseException
//1.使用try catch抓获
try {
sdf.parse("2024-12-23 22:22:22");//ParseException //使用try catch抓获
} catch (ParseException e) {
throw new RuntimeException(e);
}
//2. 使用 throws ParseException 将异常抛出
sdf.parse("2024-12-23 22:22:22");
}
}
5. 异常的处理
(1) 开发中常见的异常处理方式:
(2) 捕获异常,记录异常信息
public class Test3 {
public static void main(String[] args) {
//异常的处理
//捕获异常,记录异常信息 Exception为所有异常的父类 可直接抛Exception 异常
try {
test();
} catch (Exception e) {
e.printStackTrace();//将捕获的异常信息记录下来
}
/*catch (ExceptionTest2 e) {
System.out.println(e);
throw new RuntimeException(e);
} catch (ParseException e) {
System.out.println("解析的时间格式正确");
throw new RuntimeException(e);
}*/
}
// public static void test() throws ParseException, ExceptionTest2 { Exception为所有异常的父类 可直接抛Exception 异常
public static void test() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2024-12-23 12:12:12");
System.out.println(date);
test2(122);
}
//public static void test2(int score) throws ExceptionTest2 { Exception为所有异常的父类 可直接抛Exception 异常
public static void test2(int score) throws Exception {
if (score >0 && score <= 100) {
System.out.println("分数为" + score);
}else {
//自定义一个异常
throw new ExceptionTest2("分数不对!请输入1-100");
}
}
}
(3) 捕获异常,尝试修复异常
public class Test4 {
public static void main(String[] args) {
//捕获异常,尝试修复异常(如果输入的不是数字,程序会抛出异常,此时捕获异常并尝试修复重写输入)
while (true){
try {
System.out.println(test());
break;
}catch (Exception e) {
System.out.println("请输入合理的数字!");
}
}
}
public static double test() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("请输入分数:");
double a = sc.nextDouble();
if (a > 0.0 && a < 100.0) {
return a;
}else {
System.out.println("输入的分数不正确,请重新输入");
}
}
}
}