异常(Exception)
我今天要和大家分享的是我刚学到的异常写的不对之处请大家指出来
什么是异常?
异常:软件在编译或者运行过程中,因为一些原因(BUG、用户使用不当、代码处理不当),而引起的程序奔溃的现象,叫做异常。
异常的产生原因:
1.Java 内部错误发生异常,Java 虚拟机产生的异常。
2.编写的程序代码中的错误所产生的异常,例如空指针异常、数组越界异常等。这种异常称为未检査的异常,一般需要在某些类中集中处理这些异常。
3.通过 throw 语句手动生成的异常,这种异常称为检査的异常,一般用来告知该方法的调用者一些必要的信息。
4.用户操作不当引起的一些错误。
比如这段代码如果我们输入的被除数是0
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数");
int a = sc.nextInt();
System.out.println("请输入第二个数");
int b = sc.nextInt();
int c = a / b;
System.out.println(c);
}
这段代码就会报这样的异常,这就是一个简单的算术异常。
异常会导致代码不稳定,所以我们就需要处理异常了,处理异常可以提升代码的健壮性和稳定性,还可以提升代码的容错能力。
java中处理异常的方法通常有两种:
1.抓捕异常:
抓捕异常就是尝试着将可能存在异常的代码或者代码段进行抓捕,如果触发异常,则处理掉这些异常。
try语句块
try {
// 可能存在了异常的代码
// xxxx
} catch(ArithmeticException e) { // ArithmeticException e = new ArithmeticException();
// 说明代码处理ArithmeticException
// 在这儿处理这个异常!!!
} catch(NullPointerException e) {
System.out.println("处理空指针异常");
// 在这儿处理这个异常!!!
}catch(Exception e){
System.out.println(“其他异常”);
//使用多态,将其他异常一网打尽
}
注意:try去抓捕异常,如果没有抓到异常,代码正常执行(不会执行catch块中代码);如果抓捕到异常,则进入对应的catch块。
try语句的运行流程:
// 在try中代码,一旦出现了异常,会立刻进入到对应的catch语句中。执行处理代码,完成后代码继续向下运行,并且可以使用多个catch对应的抓捕异常。
异常对象的两个方法:
e.printStackTrace(); //打印异常信息的执行栈
e.getMessage(); //得到异常信息
这里还要讲一个finally关键字
finally语句块的代码时必须执行的,在finally的前面执行return后面的finally还会执行,注意,如果在finally之前已经return c,即使在finally里写c++,return的c值也不会改变。
//一般写垃圾回收和资源释放
try{
}finally{
//这种语句块,目的是在finally中写关键的代码。
}
2.第二种是暂时不做处理,向上层抛出异常,有上一层处理。
这种一般不建议用,但是有些情况还是要用的比如在用户注册中规定的用户名、密码不能输入一些特殊的符号什么的我们就可以设置将异常抛出让用户看到这样做是不对的并且对用户进行提示。
抛出异常的处理方式:
// 判断用户名称是否为空
if (user.getUsername() == null) {
// 抛出一个异常
throw new RuntimeException("对不起,用户名称不能为空!!!");
// 如果要人为的抛出异常,建议使用自定义异常
throw new MyException("对不起,用户名称不能为空!!!");
}
我们还可以自己定义异常
UserManager manager = new UserManager();
try {
manager.login(new User());
} catch (MyException e) {
e.printStackTrace();
System.out.println("发现了异常,问题是-->"+ e.getMessage());
}
这就是我们定义的异常
public class MyException extends RuntimeException{
private static final long serialVersio
public MyException() {
super();
}
public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
public MyException(String message) {
super(message);
}
public MyException(Throwable cause) {
super(cause);
}
}