异常处理
Exception
当程序出现异常情况,有没有处理,那么程序直接终止运行 (崩溃)
使用try-catch捕获异常
try {
//具体的代码块 会捕获这个代码块的异常
//当代码块里面出现异常,后面的代码不会执行
//不要让try包裹太多内容
} catch (IndexOutOfBoundsException e) {
//使用catch来捕获具体的一个异常
}
抛出异常时,尽量不要有太多的嵌套(否则代码结构和阅读性差)
不得不嵌套时,不要大于两层
try{
具体代码块
}catch(){
捕获的某种异常
}finally{
释放资源
注意:Java只会释放在堆或栈上的资源,不会释放外部资源
1.需要释放文件、网络和数据库资源
2.有些代码不管有没有出现异常都需要被执行
}
注意当有多个catch时,有捕获的顺序,按照子类到父类的顺序catch
如果父类的异常在前面,就会拦截子类的catch
如果不关心具体是什么异常,只是想处理一下异常,可以使用异常的父类来捕获
catch(Exception e)
使用throw抛出异常
当某个方法完成某个功能,当执行时可能出现异常,这种异常需要调用者自己决定该如何处理,就使用throws抛出异常
自定义异常
MyClass.java
class Test{
public void download() throws IOException{
FileReader fr = null;
fr = new FileReader(s: "文件路径");
fr.read();
ArrayList<String> list = new ArrayList<>();
//list.get(20);
String str = null;
str = (String) new Object();
}
//jack
//12jack
public void login(String name, String pwd) throws LoginException{
if (name.startsWith("1")){
//自己定义一个异常
throw new LoginException("用户名不能以1开头");
}
}
}
class LoginException extends Exception{
public LoginException() {
}
public LoginException(String s) {
super(s);
}
}
public class MyClass {
public static void main(String[] agrs){
Test t = new Test();
try {
t.download();
} catch {
e.printStackTrace();
}
}
public void test(){
//FileNotFoundException
// FileReader fr = new FlieReader(s: "");
//IndexOutOfBoundsException
// ArrayList<String> list = new ArrayList<>();
// list.get(2);
//NullPointerException
// String name = null;
// name.length();
//NullPointerException的捕获
// String name = null;
// try {
// name.length();
// } catch (NullPointerException e) {
// System.out.println(e.getMessage());
// e.printStackTrace();
// }
//ClassCastExcetion
// String name = null;
// Object obj = new Object();
// name = (String) obj;
}
}