异常基础
一:异常是一种程序运行时出现错误的通知调用者的一种机制。
在程序出现错误时,要及时通知程序媛,主要有两种方式1.LBYL:在操作之前做充分的检查
2.EAFP(异常的核心思想):先操作,遇到问题再处理
二:基本语法
try{
有可能出现异常的语句
}catch (异常类型 异常对象){
}
[finally{
异常的出口
}]
1.try代码块中放的是可能出现异常的代码
2.catch代码块中放的是出现异常后的行为,catch中异常捕捉的参数,需要个try中抛出的异常相匹配,当有多个catch语句时,则会匹配相应的catch,其他catch则忽略不执行。若多个异常处理的方式是完全相同的,也可以写成catch{ArrayIndexoutofBoundsException|NullpointerException}
一般不建议直接catch{Exception E}
3.finally代码块中的代码用于处理善后工作,会在最后执行,如释放资源,文件关闭等。不管是否有异常,finally中的语句一定会被执行到。
三:如果在本方法中没有合适的异常处理方式,那么就会沿着调用栈向上传递,找到匹配的处理方式。
public class Trycatch {
public static void main(String[] args) {
try{
func();
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
System.out.println("after try catch");
}
public static void func(){
int [] arr={1,2,3};
System.out.println(arr[100]);
}
}
结果:
after try catch
java.lang.ArrayIndexOutOfBoundsException: 100
at homeworks.Trycatch.func(Trycatch.java:14)
at homeworks.Trycatch.main(Trycatch.java:6)
如果一直向上传递到main方法都没有合适的异常处理方式,那么最终就会教给JVM处理,程序就会终止(如同最初没有用trycatch一样)。
异常处理流程(做多了就理解了)
四:抛出异常/异常说明
程序媛可以手动抛出一个异常,使用throw关键字完成
当我们想要将抛出的异常显示的标注在方法定义的位置,用来提醒调用者要注意捕获这些异常,则可以使用throws关键字进行异常说明
区别:throw:现在立刻马上就要抛出异常
throws:执行到这个方法时,可能会抛出异常。
五:JAVA异常体系
继承关系:
1.Error类供JVM内部使用,Exception类供程序员使用
2.Error类指的是java运行时内部出现错误或者资源耗尽错误,应用程序不抛出此类异常。一旦出现,程序终止。
3.Exception类是所使用的所有异常类的父类。
4.派生于error类或者RuntimeException类的所有异常称为非受查异常(粉色的);其他成为受查异常。
如果抛出受查异常,那么必须显示进行处理当场处理,
a)使用try catch包裹起来
b)使用throws将异常交给异常调用者处理。
六:自定义异常类
import java.util.Scanner;
public class UserLogin {
Scanner scanner=new Scanner(System.in);
private static String userName="admin";
private static String password="123456";
public static void main(String[] args){
try{
login("admin","12456");
}catch (UserError userError){
//打印出现异常的调用栈,将JVM栈之间方法的调用关系打印出来
userError.printStackTrace();
}catch(PasswordError passwordError){
passwordError.printStackTrace();
}
}
public static void login(String username,String password)throws UserError,PasswordError{
if (!UserLogin.userName.equals(username)){
throw new UserError("用户名错误");
}
if (!UserLogin.password.equals(password)){
throw new UserError("密码错误");
}
System.out.println("登录成功");
}
}
class UserError extends Exception{
public UserError(String message){
super(message);
}
}
class PasswordError extends Exception{
public PasswordError(String message){
super(message);
}
}
继承自Exception的异常默认是受查异常
继承自RuntiemException的异常是非受查异常