throw和throws的区别:
位置 | 内容 | 作用 | |
---|---|---|---|
throw | 方法内部 | 异常对象(检查异常,运行时异常) | 表明显式地生成一个异常对象,跟系统产生的异常对象或创建一个类的对象时产生的异常对象一样 |
throws | 方法声明的后面 | 异常的类型(可以拼接多个类型) | 表明该方法声明抛弃异常,不对该异常进行处理 |
- throw 异常的生成
异常对象可以是由Java
虚拟机生成的,或者是由Java类库中某些类的实例生成的,同时也可以在程序中通过throw
关键字显式地生成异常对象。 IOException e = new IOException();throw e;
- throws 异常的抛弃
如果一个方法生成了一个异常对象,但是这一方法不确切的知道该如何处理这一异常事件,可以声明抛弃异常对象,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。 int read() throws IOException{}
实例
实现一个功能:两个数相除,当除数为0的时候,程序出现异常。
制造运行时异常:
public class Test1 {
public static void main(String[] args) {
devide();
}
public static void devide() {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个数:");
int num1 = sc.nextInt();
System.out.println("请录入第二个数:");
int num2 = sc.nextInt();
if (num2 == 0) {
throw new RuntimeException();
} else {
System.out.println("商:" + num1 / num2);
}
}
}
制造检查时异常,自行解决
public static void devide() {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个数:");
int num1 = sc.nextInt();
System.out.println("请录入第二个数:");
int num2 = sc.nextInt();
if (num2 == 0) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("商:" + num1 / num2);
}
}
}
抛出异常,向上甩锅
public class Test3 {
public static void main(String[] args) {
try {
devide();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void devide() throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个数:");
int num1 = sc.nextInt();
System.out.println("请录入第二个数:");
int num2 = sc.nextInt();
if (num2 == 0) {
throw new Exception();
} else {
System.out.println("商:" + num1 / num2);
}
}
}
抛出异常,层层甩锅给JVM
public class Test3 {
public static void main(String[] args) throws Exception {
devide();
}