(1)Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为 非受查异常, 所有的其他异常称为 受查 异常.
(2)如果一段代码可能抛出 受查异常, 那么必须显式进行处理.
如 FileNotFoundException 这样的异常就是受查异常. 如果不显式处理, 编译无法通过.
显式处理的方式有两种:
a) 使用 try catch 包裹起来
示例:
```java
public class Abnormal {
public static int func() {
// 尝试读一个文件
File file = new File("d:/test.txt");
Scanner scanner = null;
try {
scanner = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return scanner.nextInt();
}
public static void main(String[] args) {
func();
}
}
b) 在方法上加上异常说明, 相当于将处理动作交给上级调用者
示例:
```java
public class Abnormal {
public static int func() throws FileNotFoundException {
// 尝试读一个文件
File file = new File("d:/test.txt");
Scanner scanner = new Scanner(file);
return scanner.nextInt();
}
public static void main(String[] args) throws FileNotFoundException {
func();
}
}
总之:
对于受查异常,我们必须处理
自定义异常类:
以前我们处理异常方式如下:
public class Abnormal {
private static final String USER_NAME = "zhangsan";
private static final String PASSWORD = "123456";
public static void login() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String userName = scanner.next();
if (!userName.equals(USER_NAME)) {
System.out.println("用户名错误");
return;
}
System.out.println("请输入密码:");
String password = scanner.next();
if (!password.equals(PASSWORD)) {
System.out.println("密码错误");
return;
}
System.out.println("登入成功");
}
public static void main(String[] args) {
login();
}
}
现在我们可以采用捕获异常来进行:
class UserException extends Exception {
public UserException(String message) {
super(message);
}
}
public class Abnormal {
private static final String USER_NAME = "zhangsan";
private static final String PASSWORD = "123456";
public static void login() throws UserException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String userName = scanner.next();
if (!userName.equals(USER_NAME)) {
//TODO 出现情况我们就抛出异常
throw new UserException("用户名错误");
}
System.out.println("请输入密码:");
String password = scanner.next();
if (!password.equals(PASSWORD)) {
throw new UserException("密码错误");
}
System.out.println("登入成功");
}
public static void main(String[] args) {
try {
login();
} catch (UserException e) {
e.printStackTrace();
}
}
}