异常:
程序在运行过程中出现的特殊情况。
异常处理的必要性:
任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。
异常的分类:
Throwable:可抛出的,一切错误或异常的父类。位于java.lang包中。
Error:JVM、硬件、执行逻辑错误,不能手动处理。
Exception:程序在运行和配置过程中产生的问题,可处理。
RuntimeException:运行时异常,可处理,可不处理。
CheckedException:受查异常,必须处理。
异常的产生:
自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常。
手动抛出异常:throw new 异常类型(“实际参数”);
一旦产生异常结果:相当于执行return语句,导致程序因异常而终止。
异常的传递:
按照方法的调用链反向传递,如果最终都没有处理异常,最终交由我们的JVM进行默认异常处理(打印堆栈跟踪信息)
受查异常:
throws 声明异常,声明位置:修饰在方法参数列表的后端。
运行时异常:
因其可处理,可不处理,无需声明。
异常的处理:
1)try{ }catch(){}
2)try{}catch(){}catch(){}
3)try{}catch(){}finally{}
4)Try{}catch(){}catch(){}finally{}
5)try{}finally{}
注意:多重catch下,遵循从子到父的顺序,父类异常在最后捕捕获
自定义异常
继承Exception(受查异常)或Exception的子类。
常用RuntimeException.(运行时异常)
必要提供的内容:
1).无参构造方法
2)String message参数的构造方法。定义异常原因信息
异常方法覆盖:
方法名、参数列表、返回值类型必须和父类相同
子类的访问修饰符和父类相同或比父类更宽泛
子类中的方法,不能抛出比父类更宽泛的异常
扩充:方法执行中字节码操作指令:
反编译:javap -verbose 文件名称(是.class) > 自定义文件名称.bytecode
作业:
5、6:
public class TestMyException {
public static void main(String[] args) {
int n;
n = 1;
try {
m(n);
} catch (MyException1 ex1) {
System.out.println(ex1.getMessage());
} catch (MyException2 ex1) {
System.out.println(ex1.getMessage());
throw new MyException2();
}
}
public static void m(int n) throws MyException1 {
if (n == 1) {
throw new MyException1("n == 1");
} else {
throw new MyException2("n == 2");
}
}
}
class MyException1 extends Exception {
public MyException1() {
}
public MyException1(String str) {
super(str);
}
}
class MyException2 extends RuntimeException {
public MyException2() {
}
public MyException2(String str) {
super(str);
}
}
8、
importjava.io.IOException;
class super{
public void ma() throws IOException {}
}
interface IA {
void mb();
}
public class MySub extends Super implements IA{
public void ma();//1
public void mb();//2
}
//1:AB 2:D
/**在1处,填入以下______代码可以编译通过,在//2处,填入______代码可以编译通过。
* A.throwsjava.io.IOException
* B.throwsjava.io.FileNotFoundException,java.io.EOFException
* C.throwsjava.sql.SQLException
* D.不能抛出任何异常。
*/
10、
public class TestFanilly {
public static void main(String[] args) {
System.out.println(ma());
}
public static int ma() {
int b;
b = 0;
try {
int n = 100;
return n / b;
} catch (Exception e) {
return 10;
} finally {
return 100;
}
}
}
/**
* 当b =0时打印100 b = 100时打印100
*/
12、
importjava.io.*;
class MySuper {
public void m() throws IOException {
}
}
class MySub extends MySuper {
public void m() throws EOFException {
}
}
class MySub2 extends MySub {
public void m() throws FileNotFoundException {
}
}/**
* 以上代码是否能编译通过?如果不能,应该如何修改? 无法通过,异常重写方法应等于父类或小于父类异常范围
*
*/
importjava.io.*;
class MySuper {
public void m() throws IOException {
}
}
class MySub extends MySuper {
public void m() throws EOFExceptior {
}
}
class MySub2 extends MySub {
public void m() throws FileNotNotFoun {
}
}