Java入门:掌握异常体系

发表时间: 2024-05-27 16:15

异常体系

  • 异常是程序在编译或运行阶段出现的问题
  • 异常出现,不提前处理,程序就会退出虚拟机
  • Exception:java.lang包下异常类,表示程序本身可以处理的问题

① RuntimeException及其子类,运行时异常,指运编译阶段不报错

② 除RuntimeException之外的所有异常,编译时报错,因此必须处理,否则无法通过编译

  • 常见的运行时异常

① 数组索引越界异常:ArrayIndexOutOfBoundsException

② 空指针异常:NullPointerException

③ 类型转换异常:ClassCastException

数学操作异常:ArithmeticException

数字转换异常:NumberFormatException

public class Demo1 {    public static void main(String[] args) {        // 数组索引越界异常:ArrayIndexOutOfBoundsException        int[] arr = {1, 2};        System.out.println(arr[2]);        // 空指针异常:NullPointerException        String name = null;        System.out.println(name.length());        // 类型转换异常:ClassCastException        Object obj = 2;        String str = (String) obj;        // 数学操作异常:ArithmeticException        int a = 10 / 0;        // 数字转换异常:NumberFormatException        String num = "12string";        Integer intNum = Integer.valueOf(num);    }}
  • 常见的编译时异常,如时间格式的处理
  • 异常处理机制

1)编译时异常处理三种方式

① 出现异常直接抛出给调用者,调用者继续抛出,throw

② 出现异常自己捕获 ,try catch

③ 前两者结合使用,出现异常抛出给调用者调用者捕获异常

import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class Demo2 {    public static void main(String[] args) throws ParseException {        String date = "2025-12-22 12:23:23";        parseTime(date);                parseTyTime(date);        try {            parseTyTTime(date);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * throws处理异常     * @param time     */    public static void parseTime(String time) throws ParseException {        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        Date d = s.parse(time);        System.out.println(d);    }    /**     * try catch处理异常     * @param time     */    public static void parseTyTime(String time) {        try {            SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            Date d = s.parse(time);            System.out.println(d);        } catch (Exception e) {            e.printStackTrace();            System.out.println("时间出现异常");        }    }    /**     * throws try catch处理异常     * @param time     */    public static void parseTyTTime(String time) throws Exception {        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        Date d = s.parse(time);        System.out.println(d);    }}

2)运行时处理机制

① 可以不处理,编译阶段不报错

② 规则建议处理,在最外层捕获处理

public class Demo3 {    public static void main(String[] args) {        try {            division(10, 0);        } catch (Exception e) {            e.printStackTrace();        }    }    public static void division(int a, int b) {        int c = a/b;        System.out.println(c);    }}
  • 自定义异常
public class Demo4 {    public static void main(String[] args) {        try {            checkAge(-1);        } catch (AgeIllegalException e) {            e.printStackTrace();        }        checkAgeRun(200);    }    public static void checkAge(int age) throws AgeIllegalException {        if(age <=0 || age > 180) {            throw new AgeIllegalException(age+" 年龄数字错误");        }    }    public static void checkAgeRun(int age) throws AgeIllegalRuntimeException{        if(age <=0 || age > 180) {            throw new AgeIllegalRuntimeException(age+" 年龄数字错误");        }    }}/** * 自定义编译时异常 * 继承Exception,重写构造器 */class AgeIllegalException extends Exception {    public AgeIllegalException() {    }    public AgeIllegalException(String message) {        super(message);    }}/** * 自定义运行时异常 * 继承RuntimeException,重写构造器 */class AgeIllegalRuntimeException extends RuntimeException {    public AgeIllegalRuntimeException() {    }    public AgeIllegalRuntimeException(String message) {        super(message);    }}