Java 异常处理

发布于 2024-09-24 08:03:47 字数 5024 浏览 8 评论 0

throw、throws、try 和 catch 的区别

  • throw : 应用在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后向调用方法对象 throw
  • throws : 应用在方法的声明中,表示该方法可能会抛出的异常,允许 throws 后面跟着多个异常类型
  • try 和 catch : 应用在代码块中,当部分代码可能存在异常时使用,将肯能存在异常的代码放在 try 代码块中,在 catch 只处理已知且可能出现的异常

    正确的个人理解是,不要无意义的乱用 try,catch,不能让这个来作为业务的一部分,除非有些情况下它的确可以,比如判断输入的字符串是不是可以转化为 int,如果不可以,则赋值 0,因为这是业务上需要的,但如果业务不允许赋值 0,那么你就应该将异常抛出,而不是自作主张的 catch,反正这个是一个需要把握的问题,一般情况下,应当将异常层层抛出,由 最外层 来决定如何处理异常
    其实很简单,过程不可控的时候,如网络通信,中间网络是否稳定是软件所无法控制的,可以 try。如本地操作数据库或者文件,都是可控的,不要用 try
    关于 Try,Catch 的正确用法 8 楼写得很好,用了 try catch 但是没有对异常进行处理,只是单纯抛出异常会导致异常的 StackTrace 信息混乱,所以如果对异常不处理一般不 catch 异常,如果在 mvc 的 controller 层做日志记录,可以 catch (Exception e) {log.error("接口调用异常"); throw;};

try 与 catch 解决程序异常

public class HelloWorld {
    public static void main(String[] args) {
        // try 代码有异常 异常点以后代码不执行 直接执行 catch 以及之后的代码
        try {
            int x = 5 / 0;
            System.out.println(x);
        } catch (Exception e) {
            // 展开错误栈
            e.printStackTrace();
        }
        System.out.println("program is still running here!");
    }
}

catch 多个异常

public class HelloWorld {

    public static void main(String[] args) {
        try {
            foo();
            bar();
        // 分别按照顺序查看多个异常,当有一个异常匹配中的时候就按照顺序检查异常
        } catch (BlogAppException e) {
            e.printStackTrace();
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("program is still running here!");
    }
}

finally 关键字

在 try/catch 语句后,我们还可以有个 finally 语句,finally 语句中的代码块不管异常是否被捕获总是要被执行的.我们将上面的程序作如下修改,来看看 finally 语句的用法与作用

public class HelloWorld {

    public static void main(String[] args) {
        try {
            foo();
            bar();
        } catch (BlogAppException e) {
            e.printStackTrace();
            return;
        } catch (ArithmeticException e) {
            e.printStackTrace();
            return; // 即使这里 return 了,依然会执行 finally 中的语句
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("programe will run `finally` code block!");
        }
        System.out.println("program is still running here!");
    }
}

throws

如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则此方法应声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理

public class HelloWorld {
    // throws 关键字将方法异常交给其调用者
    // throws 的异常应该是更加具体粒度更加细的
    private static void foo() throws Exception {
        int x = 5 / 0;
        System.out.println(x);
    }

    public static void main(String[] args) {
        try {
            foo();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("program is still running here!");
    }
}

常见异常

  • ArithmeticException (在算术运算中发生的异常,如除以零)
  • NullPointerException (变量还没有指向一个对象,就引用这个对象的成员)
  • ArrayIndexOutOfBoundsException (访问数组对象中不存在的元素)
  • IllegalArgumentException : 参数为空,确保参数的值不为空 IllegalArgumentException or NullPointerException for a null parameter

自定义异常

用户自定义异常类,只需继承 Exception 类即可.在程序中使用自定义异常类,大体可分为以下几个步骤:

  • 创建自定义异常类
  • 在方法中通过 throw 关键字抛出异常对象
  • 如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句捕获并处理;否则在方法的声明处通过 throws 关键字向方法调用者抛出异常
  • 在出现异常方法的调用者中捕获并处理异常
// cat BlogAppException.java
public class BlogAppException extends Exception {

    private static final long serialVersionUID = 1L;

    private String command;// 可以给自定义异常增加成员变量,用以保存额外的异常信息

    public BlogAppException(String command) {
        this.command = command;
    }

    public String toString(){
        return "Exception happened when executing command " + command;
    }
}

// cat HelloWorld.java
public class HelloWorld {

    private static void bar() throws BlogAppException {
        System.out.println("let's assume BlogAppException happened when executing `create` command");
        // 为了演示,这里我们假设执行 create 命令时,抛出了异常
        throw new BlogAppException("create");
    }

    private static void foo() throws ArithmeticException {
        int x = 5 / 0;
        System.out.println(x);
    }

    public static void main(String[] args) {
        try {
            foo();
            bar();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("program is still running here!");
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

粉红×色少女

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

lee_heart

文章 0 评论 0

往事如风

文章 0 评论 0

春风十里

文章 0 评论 0

纸短情长

文章 0 评论 0

qq_pdEUFz

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文