在Java中,某些错误可能超出了程序员的意料,使得程序被迫停止。为此,Java提供了异常处理机制来帮助程序员检查错误。java将异常封装到一个类中,出现错误时,就会抛出异常。
1.1异常的概念
在java中,如果一个程序抛出了异常,既可以在当前方法中捕捉、处理,也可以向上抛出,让方法调用者来处理。
public class Demo01 {
public static int div(int x, int y){
return x/y;
}
public static void main(String[] args) {
div(2,0);
}
}
/*结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.studyAbnormal.Demo01.div(Demo01.java:5)
at com.studyAbnormal.Demo01.main(Demo01.java:9)
进程已结束,退出代码为 1
*/
1.2异常的捕获
在上面的代码中,发生了异常,为了解决该异常,我们对其进行捕获。捕获结构为:try、catch、finally。格式为
try{
//代码块
}catch(异常类型){
//代码块
}catch(异常类型){
//代码块
}finally{
//代码块
}
其中,try部分放入可能发生异常的代码块,当异常发生时,异常将交给catch处理器来处理,catch处理器可以有多个,分别用来处理不同的异常,当遇到catch处理器无法处理的异常时,便执行finally后的代码块。(finally和catch可以不同时出现)
无论try是否异常finally后的代码都将被执行
public static int div(int x, int y){
return x/y;
}
public static void main(String[] args) {
System.out.println("开始捕获异常");
try{
int a=div(10,0);
System.out.println(a);
}catch(ArithmeticException b){ //此处ArithmeticException代表算数异常
System.out.println("成功捕获异常:" + b );
}finally {
System.out.println("finally被执行");
}
System.out.println("结束捕获异常");
}
/*运行结果:
开始捕获异常
成功捕获异常:java.lang.ArithmeticException: / by zero
finally被执行
结束捕获异常
进程已结束,退出代码为 0
*/
可以看到,即使try中产生异常,也没有影响到后面代码的执行。而且finally被执行。
1.3抛出异常
某个方法可能会发生异常,但是不想现在处理,就需要抛出异常。
如果方法不捕获异常,那么方法必须声明它可以抛出的这些异常。当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给调用者来处理。
public static void function() throws NumberFormatException {
String s = "abc";
Double.parseDouble(s);
}
public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能强制类型转换。");
}
}
/*结果:
非数据类型不能强制类型转换。
进程已结束,退出代码为 0
*/
throw关键字也可抛出异常
public class Demo01 {
public static int div(int x, int y){
if (y == 0){
throw new ArithmeticException("0不能被当作除数");
}
return x/y;
}
public static void main(String[] args) {
try{
div(10,0);
}catch (ArithmeticException a){
System.out.println("捕获异常:" + a);
}
}
/*结果:
捕获异常:java.lang.ArithmeticException: 0不能被当作除数
进程已结束,退出代码为 0
*/
1.4自定义异常
static class DivException extends Exception{
DivException(String s){
super(s);
}
}
public static int div(int x, int y){
if (y == 0){
try {
throw new DivException("0不能被当作除数");
}catch (DivException e) {
System.out.println("捕获异常:" + e);
}
return 0;
}
else {return x/y;}
}
public static void main(String[] args) {
div(10,0);
}