异常
public static void main(String[] args) {
int a = 1/0;
System.out.println(a);
}
抛出异常
程序执行某个方法的时候,出现异常,
就会使用这个方法生成一个代表该异常的一个对象,
停止程序的运行,并且交给JRE,来进行处理
捕获异常
JRE得到这个异常的时候,就会寻找相应的代码来处理该异常,
JRE在方法的调用栈里去查找,从生成异常方法开始回溯,
直到找到相应的异常处理代码为止
继承结构
抛出错误
第一步、将他给打包为一个该错误的对象
第二步、将错误交给他的调用者去处理
第三步、调用者可以去自己处理(try/catch),也可以继续去往上面去抛出
…
第N步、最后交给gre进行处理
例子
谁调用谁处理
public static void main(String[] args) throws IOException {}
我这里是在main()方法里面进行调用的,所以会让main()进行抛出
try/catch
try {
* 异常的部分
} catch (Exception e) {
/*
* u-toString ()方法,显示异常的类名和产生异常的原因
* u-getMessage()方法,只显示产生异常的原因,但不显示类名。
* u-printStackTrace()方法,用来跟踪异常事件发生时堆栈的内容。
* n-catch捕获异常时的捕获顺序:
*u-如果异常类之间有继承关系,在顺序安排上需注意。
*越是顶层的类,越放在下面,再不然就直接把多余的catch省略掉。
*也就是先捕获子类异常再捕获父类异常。
*/
}finally {
/*n-有些语句,不管是否发生了异常,都必须要执行,那么就可以把这样的语句放到finally语句块中。
*n-通常在finally中关闭程序块已打开的资源,比如:关闭文件流、释放数据库连接等。
*即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。
*finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。
*/
}
例子:
try {
fr = new FileReader("E:\\操作文件\\jave.txt");
char a = (char)fr.read();
System.out.println(a);
} catch (FileNotFoundException e) {
System.out.println("无法找到文件");
} catch (IOException e) {
e.toString();
System.out.println("无法读取文件");
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("无法关闭文件");
}
}
结果:
Exception in thread "main" 无法找到文件
java.lang.NullPointerException
at test_7.异常分类.tryCatch(异常分类.java:102)
at test_7.异常分类.main(异常分类.java:39)
自定义异常
一般自定义的异常继承的是运行时异常(runtimeException),如果是其他的话(Exception),就会提示,是抛出还是try/catch
public class 手动自定义抛出异常 {
public static void main(String[] args) {
Person aa = new Person();
aa.setAge(-1);
}
}
class Person{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age <= 0) {
throw new IliAgeException("年龄不可以小于零");
}
this.age = age;
}
}
class IliAgeException extends RuntimeException{
public IliAgeException() {}
public IliAgeException(String msg) {
super(msg);
}
}
``