详解Java之异常

public static void main(String[] args) {
        System.out.println(readFile());
}
public static String readFile() {
        File file = new File("d:/test.txt");
        Scanner sc = null;
        try {
                sc = new Scanner(file);
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        }
        return sc.nextLine();
}

b) 在方法上加上异常说明, 相当于将处理动作交给上级调用者

public static void main(String[] args) { 
     try { 
         System.out.println(readFile()); 
     } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
     } 
} 
public static String readFile() throws FileNotFoundException { 
     File file = new File("d:/test.txt"); 
     Scanner sc = new Scanner(file); 
     return sc.nextLine(); 
}
自定义异常类

Java 中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合我们实际情况的异常.
例如, 我们实现一个用户登陆功能.

public class Test {
    private static String userName = "admin";
    private static String password = "123456";
    public static void main(String[] args) {
        login("admin", "123456");
    }
    public static void login(String userName, String password) {
        if (!Test.userName.equals(userName)) {
            // TODO 处理用户名错误
        }
        if (!Test.password.equals(password)) {
            // TODO 处理密码错误
        }
        System.out.println("登陆成功");
    }
}
此时我们在处理用户名密码错误的时候可能就需要抛出两种异常 . 我们可以基于已有的异常类进行扩展 ( 继承 ), 创建和我们业务相关的异常类。
class UserError extends Exception {
    public UserError(String message) {
        super(message);
    }
}
class PasswordError extends Exception {
    public PasswordError(String message) {
        super(message);
    }
}
此时我们的 login 代码可以改成
    public static void main(String[] args) {
        try {
            login("admin1", "123456");
        } catch (UserError userError) {
            userError.printStackTrace();
        } catch (PasswordError passwordError) {
            passwordError.printStackTrace();
        }
    }

    public static void login(String userName, String password) throws UserError,
            PasswordError {
        if (!Test.userName.equals(userName)) {
            throw new UserError("用户名错误");
        }
        if (!Test.password.equals(password)) {
            throw new PasswordError("密码错误");
        }
        System.out.println("登陆成功");
    }

整体代码

public class Test {
    private static String userName = "admin";
    private static String password = "123456";
    public static void main(String[] args) {
        try {
            login("admin1", "123456");
        } catch (UserError userError) {
            userError.printStackTrace();
        } catch (PasswordError passwordError) {
            passwordError.printStackTrace();
        }
    }

    public static void login(String userName, String password) throws UserError,
            PasswordError {
        if (!Test.userName.equals(userName)) {
            throw new UserError("用户名错误");
        }
        if (!Test.password.equals(password)) {
            throw new PasswordError("密码错误");
        }
        System.out.println("登陆成功");
    }

    static class UserError extends Exception {
        public UserError(String message) {
            super(message);
        }
    }
    static class PasswordError extends Exception {
        public PasswordError(String message) {
            super(message);
        }
    }
}
自定义异常总结

自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常.

上一篇:Flutter AppBar组件


下一篇:Python编程基础入门:从风格到数据类型再到表达式