java通过异常处理错误

1.创建自定义异常

要自己定义异常类,必须从已有的异常类继承

package demo3;

 class FirstException extends Exception {

}

public class InheritingException{
    public void f() throws FirstException{
        System.out.println("第一个异常");
        throw new FirstException();
    }

    public static void main(String[] args){
        InheritingException exception = new InheritingException();
        try {
            exception.f();
        }catch (FirstException e){
            System.out.println("捕捉异常");
        }
    }
}

运行结果

也可以为异常类定义一个接受字符串参数的构造器

package demo3;

public class MyException extends Exception{
    public MyException() {
    }
    public MyException(String msg) {
        super(msg);
    }
}

class FullConstructors{
    public static void f() throws MyException{
        System.out.println("我的异常f()");
        throw new MyException();
    }

    public static void g() throws MyException{
        System.out.println("我的异常g()");
        throw new MyException("异常消息1111");
    }

    public static void main(String[] args){
        try {
            f();
        }catch (MyException e){
            e.printStackTrace(System.out);
        }
        try {
            g();
        }catch (MyException e){
            e.printStackTrace(System.out);
        }
    }

}

运行结果

2.异常与记录日志

public class LoggingException extends Exception {
    private static Logger logger  = Logger.getLogger("LoggingException");

    public LoggingException() {
        StringWriter trace = new StringWriter();
        printStackTrace(new PrintWriter(trace));
        logger.severe(trace.toString());
    }
}

class testException{
    public static void main(String[] args){
        try {
            throw new LoggingException();
        } catch (LoggingException e){
            System.err.println("捕捉到异常:"+e);
        }
        try {
            throw new LoggingException();
        }catch (LoggingException e){
            System.err.println("捕捉到异常"+e);
        }
    }
}

运行结果

3.使用finally进行清理

对于一些代码,可能会希望无论try块中的一场是否抛出,他们都能得到执行,这通常适用于内存回收之外的情况。可以再异常处理程序后面加上finally子句。

package demo3;
class ThreeException extends Exception {}
public class Finally {
    static int count = 0;
    public static void main(String[] args){
        while (true){
            try {
                if (count++ == 0){
                    throw new ThreeException();
                }
                System.out.println("无异常");
            }catch (ThreeException e){
                System.out.println("ThreeException");
            }finally {
                System.out.println("finally");
                if (count ==2){
                    break;
                }
            }
        }
    }
}

运行结果

在return中使用finally

因为finally自居总是会执行的,所以在一个方法中,可以从多个点返回,并且可以保证重要的清理工作仍旧会执行

package demo3;

public class MultipleReturns {
    public static void f(int i ){
        System.out.println("-------------");
        try {
            System.out.println("---1---");
            if (i == 1){
                return;
            }
            System.out.println("---2---");
            if (i == 2)
                return;
            System.out.println("---3---");
            if (i==3)return;
            System.out.println("---end---");
            return;
        }finally {
            System.out.println("---clean---");
        }
    }

    public static void main(String[] args){
        for (int i = 0;i<= 4 ;i++){
            f(i);
        }
    }
}

运行结果

原文地址:https://www.cnblogs.com/xiayq/p/10506617.html