Java异常: 程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)
执行过程中所发生的异常事件可分为两类:
(1)Error(错误):Java虚拟机无法解决的严重问题,比如:JVM系统内部错误、资源耗尽、栈溢出和OOM等情况。Error是严重错误,程序会崩溃
(2)Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,读取不存在的文件,网络连接中断等情况。Exception分为两大类:运行时异常(程序运行时发生的异常)和编译时异常(编译器检查出的异常)
异常体系图:
小结:
异常分为两大类,运行时异常和编译时异常。
(1)运行时异常,编译器检查不出,一般为编程时的逻辑错误, 是程序员应该避免其出现的异常。java.lang.RuntimeException及其子类均为运行时异常
(2)对于运行时异常,可以不做处理这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
(3)编译时异常,是编译器要求必须处置的异常
常见的运行时异常:
常见的编译异常:
异常处理的方式:
(1)try-catch-finally:捕获发生的异常自行处理
(2)throws:抛出发生的异常,交给方法的调用者来处理,最顶级的处理者是JVM
try-catch异常处理案例:
如果用户输入不是一个整数, 就提示他反复输入知道输入一个整数为止:
package Test;
import java.util.Scanner;
public class T {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String str = "";
int num;
while(true) {
try {
System.out.println("please input:");
str = cin.next();
num = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.println("input again!");
}
}
System.out.println(num);
}
}
throws:
自定义异常:
(1)定义类:自定义异常类名,继承Exception或RuntimeException
(2)若继承Exception,属于编译异常
(3)如果继承RuntimeException,属于运行异常。(一般来说,继承RuntimeException,好处是可以使用默认处理机制)
throw和throws:
异常练习:
package Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
public class T {
public static boolean if_digit(String pwd) {
for (int i = 0; i < pwd.length(); i++) {
if(pwd.charAt(i)<'0' || pwd.charAt(i)>'9') {
return false;
}
}
return true;
}
public static void userRegister(String name, String pwd, String email) {
if(name == null || pwd == null || email == null) {
throw new RuntimeException("参数不能是null");
}
int length = name.length();
if(length < 2 || length > 4) {
throw new RuntimeException("用户名长度为2或3或4");
}
if(pwd.length() != 6 || !if_digit(pwd)) {
throw new RuntimeException("密码长度为6 并且要求全部为数字");
}
int i = email.indexOf('@');
int j = email.indexOf('.');
if(i <= 0 || j < i) {
throw new RuntimeException("邮箱地址要包含@和.,并且@在.前面");
}
}
public static void main(String[] args) {
String name = "tim";
String pwd = "124342";
String email = "tim@sohu.com";
try {
userRegister(name, pwd, email);
System.out.println("kuaipa");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}