一、当涉及到break和continue语句的时候,finally字句也会得到执行。
public class Test7 { public static void main(String[] args) { int i = 0; while (true) { try { i++; if (i == 3) break; } finally { if (i == 3) System.out.println("hi");//输出hi } } } }
二、异常在继承的时候需要注意的细节:
1、异常限制对构造器不起作用,子类构造器可以抛出任意异常,而不必理会基类所抛出的异常(这与方法不同),但是由于基类构造器必须以这样或那样的方式调用,子类构造器的异常说明必须包含基类构造器的异常说明。
class Dad { public Dad() throws AException { } } class Son extends Dad { public Son() throws AException,BException/*AException必须包含在声明*/ { super(); } }
2、子类方法可以不抛出任何异常,即使是基类定义的异常,因为假使基类的方法抛出了异常,这样做也不会破坏已有的程序,所以也没有问题。
interface AInterface { public void f() throws AException; } interface BInterface { public void f() throws BException; } class Impl implements AInterface,BInterface { @Override public void f() { } }
3、如果子类对象向上转型为基类的引用,那么在调用方法的时候,编译器就会要求捕获基类可能抛出的异常。同样是上例,在main方法里向上转型为AInterface,那么编译器会要求处理异常:
public class Test8 { public static void main(String[] args) throws AException{ AInterface imp=new Impl(); imp.f(); } } interface AInterface { public void f() throws AException; } interface BInterface { public void f() throws BException; } class Impl implements AInterface,BInterface { @Override public void f() { } }
4、异常说明本身不属于方法类型的一部分,方法类型是有方法的名字和参数的类型组成的。此外一个出现在基类方法的异常说明中的异常不一定会出现在子类中。
三、getCause方法的运用:(利用getCause处理利用异常链包装进其他异常的异常)
public class Test6 { public static void main(String[] args) { try { new A().f(); }catch(RuntimeException e) { System.out.println(e.getCause());//输出three.AException } } } class A { public void f() { try { throw new AException(); } catch (AException e) { throw new RuntimeException(e); } } }
四、异常处理的原则:注意能处理的处理,但是一定不能将重要的异常通过catch语句进行捕捉造成隐藏。
时间: 2024-10-19 18:34:09