java Exception异常

异常关系

Error错误案例

public static void main(String[] args) {
    sm();
}
static int n = 0;
private static void sm() {
    n++;
    System.out.println("这是第" + n + "次调用方法");
    sm(); //递归调用,在方法体中又调用它本身
    // 运行程序出现了java.lang.StackOverflowError栈溢出错误
    // JVM管理一部分内存,分为栈区与堆区,栈区其实是比较小的一块内存空间,每次调用方法时,都会给方法分配 栈空间
    // 方法栈已满,出现JVM错误
    // 错误时以Error单词结尾,异常时以Exception单词结尾
}

异常案例及避免方法

// 运行时异常通过规范的代码可以避免
// 定义方法,计算两个正数相除
private static void divide(int m, int n) {
    // 整数相除,除数不能为0,除数为0会产生java.lang.ArithmeticException算术异常
    if (n == 0) {
        System.out.println("除数不能为0");
        return;
    }
    int result = m / n;
    System.out.println(m + "/" + n + "=" + result);
}

异常处理——抛出异常

// 异常处理——抛出异常
//定义方法,把字符串转换为指定编码的字节数组打印出来
private static void convert(String str, String charsetName) throws UnsupportedEncodingException {
    /*
     * 调用String字符串的getBytes(String charsetName) 方法把字符串转换为指定的charsetName编码的字节数组,该方法有语法错误:
     * Unhandled exception: java.io.UnsupportedEncodingException,未处理的异常
     *
     * 查看该方法定义,在方法声明行通过throws声明抛出了UnsupportedEncodingException异常,这个异常类没有继承RuntimeException类,
     * 就是一个编译异常(检查异常),根据Java语法错误,如果方法声明抛出了异常,在调用时必须进行预处理,否则语法错误
     *
     * 当前选择throws抛出处理,在当前方法声明行通过throws声明抛出这个异常,抛出给它的调用者,即谁调用convert方法,谁负责处理这个异常,
     * 在main方法中调用convert方法,就需要对convert声明抛出的异常进行预处理,也选择抛出处理,抛出给main方法的调用者JVM
     *
     * 运行程序后,如果指定的字符编码java能够支持,则程序正常执行,如果指定的字符编码java不支持getBytes()方法就会抛出异常给convert,
     * convert抛出给main,main抛出给JVM,JVM默认的处理方式时程序中断,打印异常栈跟踪信息
     */
    byte[] bytes = str.getBytes(charsetName);
    System.out.println(Arrays.toString(bytes));
}

异常处理——捕获异常

// 异常处理——捕获
private static void convert(String str, String charsetName) {
    try {
        // 可以把一组紧密相关的代码都放在try代码块中
        // 运行程序后,如果try代码块没有产生异常,则不执行catch子句,程序继续向下执行
        // 运行程序后,如果try代码块产生了异常,则立即跳转到catch子句执行,catch子句捕获这个异常后,该异常就不再继续上抛了,程序也不会中断,还需继续执行代码块以外的程序
        // 异常捕获处理的好处:提高了程序的健壮性
        byte[] bytes = str.getBytes(charsetName);
        System.out.println(Arrays.toString(bytes));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace(); //打印异常的栈跟踪信息
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值