5、异常处理


Java零基础极速入门-讲师:海波

失败,是正因你在距成功一步之遥的时候停住了脚步。


1、介绍

public class Demo {
    public static void main(String[] args) {
        // 1.类型转换错误
        //String s = "123";
        //Integer i = (Integer) s;

        // 在Java中使用特殊类描述这些错误:Error 错误(根据不同场景,会使用不同子类提示)
        // 尽量避免出现,出现JVM无法自行解决
        // 2.递归没有跳出逻辑(栈溢出错误:java.lang.StackOverflowError)
        //test();

        // 异常:偏离程序正常逻辑
        // 3.使用空对象(空指针异常:java.lang.NullPointerException)异常
        User user = null;
        System.out.println(user.toString());
        // Java中异常分类为两大类
        // 3.1 可以通过代码恢复正常逻辑执行的异常,称之为运行期异常:RuntimeException
        // 3.2 不可以通过代码恢复正常逻辑执行的异常,称之为编译期异常:Exception(系统连接数据库,数据库没开,出现错误提示)
    }
    public static void test(){
        test();
    }
}

class User{}

2、基础语法

public class Demo {
    public static void main(String[] args) {
        // 异常处理语法:
        /*
        try:尝试
        catch:捕捉
        捕捉多个异常的时候,先捕捉异常范围小的异常,在捕捉范围大的异常
        finally:最终

        try{
            可能会出现异常的代码
            如果出现异常,JVM会将异常进行封装,形成一个具体的异常类,然后将这个异常抛出
            所有的异常对象都可以被抛出
        } catch(抛出的异常对象 对象引用(先捕捉异常范围小的,在捕捉范围大的)){
            异常的解决方案
        } catch(){

        } finally {
            最终执行的代码逻辑
        }
         */

        // 异常除数为零

        //int i = 0;
        //int j = 10 / i;
        //System.out.println(j);
        int i = 0;
        int j = 0;
        try {

           j = 10 / i;
        }catch (ArithmeticException e){
            //e.getMessage();//错误信息
            //e.getCause();//错误的原因
            e.printStackTrace();//打印堆栈信息
            // 可以对c错误的代码做处理
            i = 10;
            j = 10 / i;
        } finally {
            System.out.println("最终执行的代码");
        }
        // 最终结果
        System.out.println(j);
    }
}

3、常见异常

3.1、算术异常

java.lang.ArithmeticException

public class Demo {
    public static void main(String[] args) {
        // 运行期异常:JVM不会做出提示和处理,运行报错了,代码逻辑处理就可以了
        // 例1:除数为0的算术异常:java.lang.ArithmeticException
        // 通过代码逻辑解决
        int i = 0;
        if (i != 0) {
            int j = 10 / i;
        }
    }
}

3.2、空指针异常

java.lang.NullPointerException

public class Demo {
    public static void main(String[] args) {
        // 例2:空指针异常:java.lang.NullPointerException
        // 调用了一个为空(null)对象的成员属性或成员方法时,就会发生异常
        // 通过代码逻辑解决
        User user = null;
        //if (user != null) {
        //    System.out.println(user.toString());
        //}
        // 通过异常解决,发现代码中造成这里为空的原因(早有异常早解决)
        try{
            System.out.println(user.toString());
        } catch (NullPointerException e){
            System.out.println("对象为空,需要分析数据为空的原因");
        }
    }
}

class User {}

3.3、索引越界异常

java.lang.ArrayIndexOutOfBoundsException

public class Demo {
    public static void main(String[] args) {
        // 例3. 索引越界异常:java.lang.ArrayIndexOutOfBoundsException
        String[] names = new String[3];
        names[0] = "zhangsan";
        names[1] = "lisi";
        names[2] = "wangwu";
        // 通过程序逻辑解决异常
        if(names.length == 4){
            names[3] = "zhaoliu";//没有索引3
        }
    }
}

3.4、字符串索引越界

java.lang.StringIndexOutOfBoundsException

public class Demo {
    public static void main(String[] args) {
        // 例4. 字符串索引越界:java.lang.StringIndexOutOfBoundsException
        String s = "abc";
        System.out.println(s.charAt(3));
    }
}

3.5、格式化异常

java.lang.NumberFormatException

public class Demo {
    public static void main(String[] args) {
        // 例5. 字符串转数字异常 格式化异常:java.lang.NumberFormatException
        String s = "a123"; // 想要自己做处理,需要使用正则表达式,已实现校验
        // Integer i = Integer.parseInt(s);
    }
}

3.6、类型转换异常

java.lang.ClassCastException

public class Demo {
    public static void main(String[] args) {
        // 例5.类型转换异常:java.lang.ClassCastException
        Object obj = new User();
        // 代码解决:使用instanceof比较类型是否相同
        if (obj instanceof Emp) {
            Emp emp = (Emp) obj;
        }
    }
}

class User {}

class Emp {}

4、抛出异常

public class Demo {
    public static void main(String[] args) {
        //
        User user = new User();
        user.test(10,0);
    }
}

class User {
    // 如果方法中可能会出现问题,就需要提前声明,告诉其他人,我的方法会出现问题
    // throws关键字 抛出运行时异常,调用者处理或不处理都可以
    // 如果程序中需要手动抛出异常对象,使用try{}catch(){借助throw关键字,new出异常对象}处理异常,调用者必须处理异常
    public void test(int i, int j) throws ArithmeticException{
        try {
            System.out.println(i / j);
        } catch (ArithmeticException e){
            throw new ArithmeticException();
        }
    }
}

5、自定义异常

public class Demo {
    public static void main(String[] args) {
        // 登录操作
        String account = "zhangsan";
        String password = "123123";
        try {
            login(account, password);
        } catch (AccountException e){
            System.out.println("账号不正确,需要重新修正");
        } catch (PasswordException e){
            System.out.println("密码不正确,需要重新修正");
        }
    }

    public static void login(String account, String password) {
        if (!"admin".equals(account)) {
            throw new AccountException("账号不正确");
        }
        if (!"admin".equals(password)) {
            throw new PasswordException("密码不正确");
        }
    }
}

class AccountException extends LoginException {

    public AccountException(String message) {
        super(message);
    }
}

class PasswordException extends LoginException {

    public PasswordException(String message) {
        super(message);
    }
}

// 自定义异常
// 继承RuntimeException,属于运行时异常(不需要任何操作),继承Exception,属于编译时异常(必须处理异常)
// 异常挨个抛出,也可以抛出它们的父类
class LoginException extends RuntimeException {
    public LoginException(String message) {
        super(message);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值