什么是异常
在生活中我们头疼脑热都是身体出现的异常,在代码中也是一样的,尽管程序员在写代码时已经非常追求完美,但是总会有一些不尽人意的错误出现,我们将这种程序在执行过程中出现的不正常行为称为异常。
例如:
通过举例我们发现,在Java中不同类型的异常,都会被其对应的类来描述。
异常的分类
我们再来看一个例子:
如上图我们没有对异常进行处理,我们的代码就会报错了,有的兄弟就会有问题了,刚才的三个例子我们也没有对可能有的异常进行处理,为什么代码却没有报错呢?这是因为异常分为两类:
1、编译时异常,也称为受查异常,在编译时发生的异常。
2、运行时异常,也称非受查异常,在运行时发生的异常。
通过上面两个例子的对比我们就知道,受查异常出现时,必须进行异常处理,如果不处理,代码编译不过,而非受查异常则没有这么严格。注意:在编译时出现的语法错误不是异常,而是错误。
异常肯定时千奇百怪的,Java为了对不同异常或者错误进行很好的分类管理,在Java内部维护了一个异常的体系结构:
异常的处理流程
要想处理异常我们就需要认识五个关键字throw try catch final throws
。
throw异常的抛出
我们看这样一个例子:
这就是throw的用法,还有一些注意事项:
1、throw必须写在方法体内部
2、抛出的对象必须时Exception或者他的子类
3、如果抛出的是非受查异常,则可以直接交给jvm处理。
4、如果抛出的受查异常,则必须处理,否则无法编译
5、异常一旦抛出,后面的代码就不会执行了。
throws 和 try-catch捕获异常
这里有些注意事项:
1、throws必须跟在方法的参数列表之后
2、声明的异常必须是Exception或者他的子类
3、如果抛出多个异常,可以用,隔开。
4、在抛出受查异常时,调用者必须对该异常进行处理,或者继续throws抛出。
5、try块内抛出异常位置之后的代码不会执行
6、如果抛出异常类型与catch不匹配,异常就不会被捕获,也不会处理,继续外抛知道被jvm处理。
7、catch可以有多个,且子类异常在父类异常之前
finally
finally
不管什么情况一定会被执行,一般我们在finally
块里面写的都是无论是否发生异常都需要执行的代码,例如资源的回收,网络的连接,数据库的链接等。
自定义异常类
尽管Java为我们提供了很多异常类,但是在我们的实际开发过程中肯定会有一些千奇百怪的问题出现,这时我们就需要自己自定义一个异常类,如何定义呢?下面让我来给大家写一个例子:
package demo3;
import java.util.Scanner;
public class Test {
public static void login() throws NameException,PassWordException{
String name = "admin";
String password = "1234";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String name1 = scanner.nextLine();
if(!name.equals(name1)) {
throw new NameException("用户名错误");
}
System.out.println("请输入密码:");
String password1 = scanner.nextLine();
if(!password.equals(password1)) {
throw new PassWordException("密码错误");
}
}
public static void main(String[] args) {
try {
login();
}catch (NameException ex) {
ex.printStackTrace();
System.out.println("用户名错误");
}catch (PassWordException ex ) {
ex.printStackTrace();
System.out.println("密码错误");
}
}
}
public class NameException extends Exception{
public NameException(String string) {
super(string);
}
}
public class PassWordException extends Exception{
public PassWordException(String string) {
super(string);
}
}
上图我们就自己定义了两个异常类,一个是用户名异常,一个是密码异常,这样在我们登录时,输入错误的密码和用户名时会出现异常。
1、自定义异常通常会继承
Exception
或者RuntimeExcepion
2、继承自Exception
的异常默认是受查异常
3、继承自RuntimeException
的异常默认是非受查异常。
以上就是Java中关于异常的一些知识。