1、常见的异常类型
Exception | 异常层次结构的根类 |
ArithmeticException | 算数错误情形 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
InputMismatchException | 欲得到的数据类型与实际输入的类型不匹配 |
IllegalArgumentException | 方法接受到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常 |
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
System.out.println("请输入被除数:");
try {
int num1=input.nextInt();
System.out.println("请输入除数:");
int num2=input.nextInt();
System.out.println(String.format("%d / %d = %d",
num1, num2, num1 / num2));
}catch (Exception e) {
System.err.println("出现错误:被除数和除数必须是整数,"+
"除数不能为零。");
System.out.println(e.getMessage());
}
}
System.err.println();标准错误输出流,这种输出方式可以输出错误的消息,在控制台呈现红色。
System.out用于正常的输出,也就是程序真正想输出的内容。而System.err用于出错信息的输出,也就是你本来不期待看到的东西。
2、try-catch**、**try-catch-finally
try-catch-finally 程序块的流程大致分为两种情况:
- 如果try块中所有语句正常执行完毕,那么finally块就会被执行。
- 如果try语句在执行过程中碰到异常,无论这种异常能否被catch块捕获到,都将执行finally块中的代码。
try-catch-finally结构中try块是必须有的,catch和finally块为可选,但两者至少必须出现其中之一。
3、try-catch-catch-finally(多重catch块)
在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要刚在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到…异常的错误。
4、try-catch-finally中包含return的情况
情况1:try{} catch(){}finally{} return; 顺序执行即可
情况2: try{ return; }catch(){return;} finally{} return; 程序执行try块中(有异常时执行catch(){})的return之前的代码后,然后执行finally块,最后执行try块(或者catch)中的return。此时程序已经返回,不再执行finally{}后面的return了。
情况3:try{return;} catch(){return;} finally{return;} return; 执行try 或者catch中的return语句之前,都会先执行finally语句, 如果finally中有return语句,那么程序就return了。
总结:如果finally存在的话,任何执行try 或者catch中的return语句之前,都会先执行finally语句, 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。
5、throws 和 throw
1、throws 声明异常
2、throw 抛出异常,throw(异常对象)
public class Test {
// throws 声明异常
public static void Test3() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try {
Test3();
} catch (NumberFormatException e) {
// 捕获异常
System.err.println("非数据类型不能转换。");
}
}
}
public class Test2 {
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
// throw 抛出异常,throw(异常对象)
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
}
throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。
而throw则是指抛出的一个具体的异常类型。