异常处理

异常处理

1.在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。

2.发生异常时,控制流立即跳转到关联的异常处理程序(如果存在)。

3.如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误信息。

4.可能导致异常的操作通过 try 关键字来执行。

5.异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。

6.程序可以使用 throw 关键字显式地引发异常。

7.异常对象包含有关错误的详细信息,其中包括调用堆栈的状态以及有关错误的文本说明。

8.即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。

Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。

1.try:它里面放置可能引发异常的代码

2.catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。

3.finally:主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者 throw等终止方法的语句,则就不会跳回执行,直接停止。

4.throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。

5.throws:用在方法签名中,用于声明该方法可能抛出的异常。

Java的异常分为两种,checked异常(编译时异常)和Runtime异常(运行时异常)

  1. java认为checked异常都是可以再编译阶段被处理的异常,所以它强制程序处理所有的checked异常,而Runtime异常无须处理,java程序必须显式处理checked异常,如果程序没有处理,则在编译时会发生错误,无法通过编译。

  2. checked异常体现了java设计哲学:没有完善处理的代码根本不会被执行,体现了java的严谨性,

    对于构造大型、健壮、可维护的应用系统而言,错误处理是整个应用需要考虑的重要方面。Java异常处理机制,在程序运行出现意外时,系统会生成一个Exception对象,来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。

    如果执行try块里的业务逻辑代码时出现异常,系统会自动生成一个异常对象,该异常对象被提交给运行环境,这个过程被称为抛出(throw)异常。Java环境收到异常对象时,会寻找合适的catch块,如果找不到,java运行环境就会终止,java程序将退出。

Throwable():Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

1.Error(错误):一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。

2.Exception:Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件

(1). SQLException:该异常提供关于数据库访问错误或其他错误的信息。

(2). RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类

(3).IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。

异常对象包含的常用方法:

  1. getMessage();返回该异常的详细描述字符

  2. printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。

  3. printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定的输出流

  4. getStackTrace():返回该异常的跟踪栈信息。

例1、异常处理机制中的 try catch

package day03;
/**
 * java异常处理机制中的 try catch
 * @author Administrator
 *
 */
public class ExceptionDemo1 {

    public static void main(String[] args) {
         try{
             String str=null;
             /**
              * 当出现空指针后,jvm创建空指针异常
              * 实例,将它抛出来
              */
             System.out.println(str.length());
         }catch(NullPointerException e){
             System.out.println("出现一个空指针");
         }
        System.out.println("程序结束了!");
    }

}

2、finally的使用

  • 无论try块的代码是否出现异常finally块中的代码都要执行
    通常我们会在finall中做清理操作比如释放连接,关闭流等
package day03;
/**
 * finally块
 * 无论try块的代码是否出现异常
 * finally块中的代码都要执行
 * 通常我们会在finall中做清理操作
 * 比如释放连接,关闭流等等等
 * @author Administrator
 *
 */
public class ExceptionDemo3 {

    public static void main(String[] args) {
        try{
            System.out.println("与数据库中建立连接");
            System.out.println("连接成功");
            System.out.println("从数据库中查询数据");
            String str="a";
            int i=Integer.parseInt(str);
            System.out.println("数据处理完毕");
            System.out.println("将数据保存至数据库");
        }catch(Exception e){
            System.out.println("程序运行出现了错误!");
        }finally{
            System.out.println("数据库断开连接!");
        }

    }

}

3、Exception方法

1.       getMessage();返回该异常的详细描述字符
2.       printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
3.       printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定的输出流
4.       getStackTrace():返回该异常的跟踪栈信息。
package day03;
/**
 * Exception常用方法
 * @author Administrator
 *
 */
public class ExceptionDemo6 {

    public static void main(String[] args) {
        System.out.println("程序开始了"); 
        try{
             String str=null;
             System.out.println(str.length());
         }catch(Exception e){
             //输出程序运行的错误信息
             e.printStackTrace();
             //e.getMessage 得到有关异常事件的信息
             System.out.println(e.getMessage());
             System.out.println("程序出错了");
         }
        System.out.println("程序结束了");
    }

}

4、getCause()方法的使用
将实际异常包装之后再抛出,若想获取真是原因,可以调用异常的

package day03;
/**
 * 获取错误的原因
 * 当程序出现一个异常的风格统一,将实际异常
 * 包装之后再抛出,若想获取真是原因,可以调用异常的
 * getCause()
 * @author Administrator
 *
 */
public class ExceptionDemo7 {

    public static void main(String[] args) {
         try{
             String str=null;
                System.out.println(str.length());
         }catch(Exception e){
            System.out.println(e.getCause()); 
         }

    }
    public static void dosome()throws Exception{
        try{
            String str=null;
            System.out.println(str.length());

        }catch(Exception e){
            throw e;
        }
    }

}

5、自定义Exception
目的:为了更加精准地捕获和处理异常以呈现更好的用户体验
需要开发者自定义异常
语法:class[自定义异常类名]extends Exception{
….
}

“`
package day03;
/**
* 自定义异常
* 表示年龄不符合人类范围
* @author Administrator
*
*/
public class IllegalAgeException extends Exception {

private static final long serialVersionUID=1L;

public IllegalAgeException(){
    super();

}
public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
    // TODO 自动生成的构造函数存根
}
public IllegalAgeException(String message, Throwable cause) {
    super(message, cause);
    // TODO 自动生成的构造函数存根
}
public IllegalAgeException(String message) {
    super(message);
    // TODO 自动生成的构造函数存根
}
public IllegalAgeException(Throwable cause) {
    super(cause);
    // TODO 自动生成的构造函数存根
}
public static void main(String[] args) {

}

}

注意点1:只有try是必须的,也就是说如果没有try块,则不可能有后面的catch块和finally块;

**注意点2:**catch块和finally块都是可选的,但catch块和finally块至少出现其中之一,也可以同时出现;

注意点3:可以有多个catch块,捕获父类异常的catch块必须位于捕获子类异常的后面;

注意点4:不能只有try块,既没有catch块,也没有finally块;

注意点5:多个catch块必须位于try块之后,finally块必须位于所有catch块之后。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值