- try-catch-finally 程序员在代码中国捕获发生的异常,自行处理
try{
可能发生异常的代码块}catch(Exception e){
系统将其封装成Exception对象 ,传递给catch。也可以在这里增加自己的业务逻辑
}finally{
不管是否有异常发生,finally代码块一定会执行
}
注意事项:
如果在try中发生异常了,则其后面的语句不会执行,直接进入catch中
package Learn;
public class Test {
public static void main(String[] args) {
String name="鲁迅";
try{
int num=Integer.parseInt(name);
System.out.println("我又没有输出");
}
catch (Exception e){
System.out.println("发生异常了");
}finally {
System.out.println("运行结束");
}
}
}
try{}finaly{}也可以直接使用,但是程序会崩溃。并且finaly中语句会执行,但是其后面的程序并不会执行。
- throws处理机制
我们假设jvm虚拟机调用main方法,而main方法调用了f1方法,f1调用f2方法。如果f2方法有异常,那么在f2中可以用try-catch方法自己处理,也可以throws抛出给f1方法,同理f1也可以做出相同的操作,而方法如果一直往上抛出,最终给到了jvm虚拟机会直接打印出来异常信息,进而中断程序。
在Java中,如果我们没有用操作区管理异常,则默认会一直向上抛出,直到jvm,在下面中我们可以看到f1中存在的异常抛出给了main方法,main方法捕捉并且进行处理。
package Learn;
public class Test {
public static void main(String[] args) {
AA aa = new AA();
try {
aa.f1();
}catch (ArithmeticException arithmeticException){
System.out.println("有错误");
}
}
}
class AA{
public void f1() throws ArithmeticException {
int a=10/0;
}
}
细节问题:
对于问题中的编译异常必须进行处理,而运行异常则有默认的处理机制
对于子类重写父类方法时,子类抛出的异常必须是父类异常的子类型或者相同
class AA{
public void f1() throws Exception {
int a=10/0;
}
}
class BB extends AA{
@Override
public void f1() throws ArithmeticException{
}
}