本节内容
1.编码时常见的几种异常
2.使用try-catch捕获异常
3.使用Exception拦截所有异常
4.抛出和自定义异常
当程序出现异常时,如果没有处理,那么程序就会直接终止运行(崩溃)。但是通过Java的异常处理机制,我们不仅可以发现异常,还可以执行后面的程序。这就是异常处理的功能。
一、编码时常见的几种异常
1.类型转换的错误,也就是当把一个值赋给另一个值时可能出现的错误ClassCastException
String name =null;
Object obj= new Object();
name =(String)obj;
2.空指针异常,比如定义的字符串为空,然后直接调用了它的.length函数,就会出现 NullPointerException
String name= null;
name.length();
3.索引值越界异常,就是数组下标超过数组的长度。比如定义了一个数组,还没有赋值,就直接调用它的get函数,那么就会出现索引值越界异常IndexOutOfBoundsException
ArrayList<String> lists=new ArrayList<>();
lists.get(2);
二、使用try-catch捕获异常
1.try语句里面写具体的代码块,会捕获这个代码块里面的异常。当代码块里出现异常,在try里面,后面的代码就不会执行。所以不要在try里面包含太多的内容。例如,在以下代码块里面,System这个操作就不会被执行。
try{
lists.get(2);
System.out.println("after");
}
2.使用catch来捕获具体的一个异常,每个catch只能捕获一个异常,catch参数类型就为可能出现的异常,还可以调用printStackTrace()函数打印异常信息,也可以调用getMessage()函数查看异常错误。因为printStackTrace()会显示具体的出现错误的行数,所以一般用这个比较多。
catch (IndexOutOfBoundsException e){
// 打印异常信息
e.printStackTrace();
System.out.println(e.getMessage());
}
平常我们调用try-catch函数时不用自己写这么麻烦,直接按住alt+enter键,然后选择 surround with try/catch即可,它会自动帮我们写好并且排布好。例如以下代码,就写好 FileReader fr = new FileReader(" ");之后按住键,然后进行上面的操作即可。
try {
FileReader fr = new FileReader(" ");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
注意:抛出异常时,尽量不要出现太多的嵌套(会导致代码结构和阅读性较差),不得不使用嵌套时,也不要大于2层。可以使用以下方式捕获异常,catch后面可以跟上很多个catch,需要捕获异常的代码都放在try里面。
当有多个catch时,有捕获的顺序,按照子类到父类的顺序去捕获。如果父类的异常在前面,就会拦截子类的catch。
try {
//代码块
}catch (){
//相应操作
}catch (){
//相应操作
}
}
3.finally语句块放在catch语句块后面,注意:Java只会释放在堆或者在栈上的资源,不会释放外部资源(比如硬盘)。然后在finally里面还可以嵌套try-catch语句。不管有没有异常,finally都会被执行。
4.finally使用场景:①需要释放文件、网络和数据资源 ②有些代码不管有没有出现异常都要被执行。以下为使用的一套规范
try {
lists.get(2);
} catch (IndexOutOfBoundsException e) {
// 打印异常信息
e.printStackTrace();
// System.out.println(e.getMessage());
}finally {
System.out.println("你好我成功了");
}
三、使用Exception拦截所有异常
1.如果不太关心具体是什么异常,只是想处理一下异常,可以使用异常的父类来捕获。
catch (Exception e){
}
四、抛出和自定义异常
1.使用throw抛出异常:某个方法完成某个功能,当执行时可能出现异常,这种异常需要调用者自己决定该如何处理,就使用throws抛出异常。也就是抛出异常后选择是否要进行处理。例如以下
class Test {
public void show()throws IOException{
FileReader fr=null;
fr = new FileReader(" ");
fr.read();
ArrayList<String> lists = new ArrayList<>();
String str= null;
str=(String) new Object();
}
}
在主类里面,创建一个Test类,就需要时才使用。
Test t =new Test();
try{
t.show();
} catch (IOException e) {
e.printStackTrace();
}
2.自定义异常:自己创建一个类,继承于Exception即可
class loginException extends Exception{
public loginException(){
}
public loginException(String s){
super(s);
}
}
然后写一个方法继承于这个异常即可
public void login(String name,String pwd) throws loginException {
if(name.startsWith("1")){
//自己定义一个异常
throw new loginException("用户名不能以1开头");
}
}
在主类里面,通过之前创建的对象t调用 login方法,然后创建try-catch即可
try {
t.login("1jack","123");
} catch (loginException e) {
e.printStackTrace();
}
欧克,以上就是今天的全部内容,再见。
网友评论