zoukankan      html  css  js  c++  java
  • 这几种Java异常处理方法,你会吗?

    摘要:我们在软件开发的过程中,任何语言的开发过程中都离不开异常处理。

    本文分享自华为云社区《Java异常处理学习总结》,作者: zekelove 。

    我们在软件开发的过程中,任何语言的开发过程中都离不开异常处理。如果不处理异常,将会导致软件异常中断,崩溃,退出,严重影响用户的使用和体验。如果合理的应用异常处理那将会减少软件出现的错误,可以友好的提示用户,提升用户的体验。

    异常是什么

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。如:用户输入非法数据,做除法运算的时候除数为0,语句少写分号,打开的文件不存在,内存溢出,网络中断等。

    异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。

    异常类型

    Java中所有的异常类是从 java.lang.Exception 类继承的子类。Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

    检查性异常:用户错误或问题引起的异常,这是程序员无法预见的。除了Error 和 RuntimeException的其它异常。

    运行时异常: 运行时异常是可能被程序员避免的异常。Error 和 RuntimeException 以及他们的子类。

    错误: 错误不是异常,而是脱离程序员控制的问题。通常的做法是通知用户并中止程序的执行。

    常见异常

    输入输出异常:IOException

    算术异常类:ArithmeticExecption

    空指针异常类:NullPointerException

    类型强制转换异常:ClassCastException

    文件未找到异常:FileNotFoundException

    数组下标越界异常:ArrayIndexOutOfBoundsException

    数组负下标异常:NegativeArrayException

    文件已结束异常:EOFException

    字符串转换为数字异常:NumberFormatException

    方法未找到异常:NoSuchMethodException

    操作数据库异常:SQLException

    常用异常方法

    getMessage:获取异常的详细信息。

    toString:使用getMessage()的结果返回类的串级名字。

    printStackTrace:错误输出流。

    异常处理

    对检查异常处理的方式:使用 try…catch…finally 语句块处理;在函数定义中使用 throws 声明。

    语法:

    try{
        // try 块中放可能发生异常的代码。
    }catch(ArithmeticException arithexception){
        // 1.每一个 catch 块用于捕获并处理一个特定的异常,或者异常类型的子类。
        // 2.catch 后面括号中定义了异常类型和异常参数。
        // 3.在 catch 块中可以使用这个块的异常参数来获取异常的相关信息。
        // 4.如果 try 块中发生的异常在所有catch中都没捕获到,则去执行finally,然后到这个函数的外部 caller 中去匹配异常处理器。
        // 5.如果 try 中没有发生异常,则所有的catch块都不执行。
    }catch(Exception exception){
        // 捕获异常
    }finally{
        // 1.finally 块是可选的。
        // 2.无论异常是否发生,finally 都会执行。
        // 3.一个 try 至少要有一个 catch 块,或者至少要有一个 finally 块。
        // 4.finally 块主要做一些关闭清理工作,如关闭文件,关闭数据库连接等。 
    }

    示例

    package com.exception;
    public class test {
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            compute();
        }
    
        public static void compute() {
            try {
                double num = 10 / 0;
                System.out.println(num); 
            }catch(ArithmeticException exp){
                System.out.println(exp.getMessage().toString());
            }finally {
                System.out.println("执行finally块");
            }
        }
    }

    关键字 throws/throw

    如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明,throws 关键字放在定义方法的尾部。

    也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

    throws 语法:

    修饰符 返回值类型 方法名(参数) throws 异常类名1, 异常类名2, ... { 代码块 }

    package com.exception;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    public class test {
    
        public static void main(String[] args) throws FileNotFoundException {
            // TODO 自动生成的方法存根
            readFile();
        }
     
        public static  void readFile() throws FileNotFoundException {
            InputStream file = new FileInputStream("E:/test.txt");
        }
    }

    throw 语法:

    throw new xxxException();

    其中 xxxException 必须是 Exception 的派生类。

    注意:throw 出的是1个异常对象,所以 new 不能省略。

    自定义异常

    除了JDK定义好的异常类外,我们可以根据自身业务情况自定义异常处理类。

    编写自定义异常类注意点:

    1.所有异常都必须是 Throwable 的子类。

    2.如果写一个检查性异常类,则需要继承 Exception 类。

    3.如果写一个运行时异常类,则需要继承 RuntimeException 类。

    语法:修饰符 class 类名 extends Exception { 代码块 }

    package com.exception;
    /**
     * 自定义异常类
     * 登录失败异常信息类
    */
    public class LoginFailException extends RuntimeException {
        public LoginFailException() {
            super();
        }
        public LoginFailException(String message) {
            super(message);
        }
        public void printStackTrace(){ 
            //overwrite  
            super.printStackTrace();  
            System.out.printf("This is a LoginFailException excetpion\n");    
        }  
    }
    public class test {
    
        public static void main(String[] args){
            // TODO 自动生成的方法存根
            Boolean isLogin = false;
            if(!isLogin) {
                // 登录失败,抛出异常
                throw new LoginFailException("Login is fail");
            }
        }
    }

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
    Build CRUD Application with jQuery EasyUI
    sql里的ROW_NUMBER() OVER是啥意思?
    EasyUI实战篇之datagrid:如何重新设置datagrid所配置的属性(options)并重新查询列表(relaod)
    UNIX基础知识之程序和进程
    UNIX基础知识之输入和输出
    UNIX基础知识之文件和目录
    输出至标准出错文件的出错处理函数
    apue.h
    目录操作函数opendir、readdir和closedir
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/15410396.html
Copyright © 2011-2022 走看看