1:了解异常
异常是程序设计不可避免的,java中的主要是两种A:Exception B:Error
它们都有一个共同特点,都是throwable的子类,接下来分别介绍一下A B
A:Exception 是异常的意思,这个是一般性的错误,一般是可以干预的,他有几个常用的子类
- NullPointException :这是最常遇见的错误之一,空指针,所谓空指针,就是单单定义了一个类型的变量,没有在堆终给他指定任何的对象,当用这样的变量就会产业空指针异常
- IndexOutputException :越界异常,一般在使用集合时,当获取使用的下表超过它的总数,就会产生这个异常
- ArrayIndexOutputException:数组越界,和上一个差不多
- StringIndexOutputException:当有String类型,通过charAt()方法获取指定下表元素时,超过他的范围就会产生这个异常
- ClassCastException:类型转换异常
还有等等一系列异常
B:Error是错误的意思,这是比较严重的问题,一般不可人为干预,当出现这个错误时,需要重启虚拟机重新运行
2 :异常的分类
异常类一般分为运行期异常和编译器异常
A:运行期异常
运行期异常,是虚拟机在执行时遇到的异常,一般有空指针和数组越界等等,当产生运行期异常时,虚拟机会根据异常类型,创建一个对象,并将这个异常抛出,然后查看有没有来捕捉这个异常,如果没有捕捉,虚拟机将会停止不执行接下来代码,在停止之前将这个错误的信息打印出来,如果有写捕捉,虚拟机将会走捕捉的程序,虚拟机执行下面的代码。
B:编译器异常
编译器异常是,在代码编写时,有部分代码,java提醒你,你这部分代码可能会产生异常,可以声明一下这个异常或者捕捉,例如IO流部分可能会产生FileNotFoundException异常,需要提醒或者捕捉都可以
3:处理异常
在java编写时我们可以捕捉和声明异常
A:声明异常:就是在java,我们可以使用throws()将可能出错的异常声明一下,你只需要提醒一下,不需要自己给方针,当外界调用这个方法时,可以将这个异常继续往下抛或者捕捉一下这个异常
B:异常捕捉
在java编写时,对于异常还可以进行抛出来,如果抛出来,就不需要声明,异常捕捉的格式是
try {
代码块A
代码块B
//在try里放的是可能出错的代码
}
//catch括号里放的时,可能出现的类型异常,这里放的是父类Exception将一切异常进行捕捉
catch (Exception e) {
代码块C //catch里放的是,如果出现了异常将要执行的代码块
}
finally {
代码块D
//finally存放的是无论这个程序无论有没有产生异常都会执行的代码块
//不管怎么样都会执行的代码块
}
注意:
- 如果在代码块部分产生了异常,无论有没有捕捉到,try{}这个方法体里的代码都不会执行
即如果代码块A出现了异常,无论有没有捕捉到代码块B都不会执行 - 如果代码块A和代码块B都没有异常,则不会走catch里的代码块C,但会走finally里的代码块D
- 如果代码块A或B出现了异常,则匹配有没有捕捉到,如果没有捕捉到,则虚拟机也会执行代码块D后关闭虚拟机,但执行顺序不确定
- 如果有错误并捕捉到,会一步步执行,并跳出这个try()…catch执行下面的代码
捕捉有返回值时finally执行时机
int a=100;
try {
a=200;
代码块A
return a;
} catch (Exception e) {
a=300;
代码块B
return a;
} finally {
a=400;
代码块C
return a;
}
A:如果代码块A有异常被捕捉到时
代码首先进去catch时,当执行到return B时,(当执行return时,就会退出这个方法),系统会查看这个try catch有没有finally代码块,发现有,则会在返回catch里的a时,执行finally类,将finally里的a进行返回出来
B:当没有被捕捉到,直接进finally,返回finally里的a
int a=100;
try {
a=200;
代码块A
return a;
} catch (Exception e) {
a=300;
代码块B
return a;
} finally {
a=400;
代码块C
}
例如这个代码块,在finally只有赋值没有返回
A:如果代码A出现异常并捕捉时,同样会先进入catch,当执行到退出语句时进去进入finally代码块,但没有返回只有将a赋值,这样返回的就是catch里的a的值
B:没有捕捉到,返回try里的a
4:自定义异常类
例如当进行外部传参数时,如果传的是年龄,则不可能有负数,但这种异常java内部是捕捉到的,这就需要异常类来
A:异常类首先要创建一个类,但这个类要继承Exception类或者RuntimeException类,Exception是编译期异常RuntimeException是运行期异常
public class AException extends Exception {
private int age;
public AException(String s) {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class ExceptionTest {
public void run(int a) throws AException {
if(a<0) {
throw new AException("年龄不能为负数");
}else {
}
}
public static void main(String[] args) throws AException {
ExceptionTest e=new ExceptionTest();
e.run(-3);
}
}