Java_异常处理

一、异常处理(ctrl+alt+T)

1.异常:

异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)

异常分为两类 :Error和Exception

  • Error:一般不编写针对性的代码进行处理。
  • Exception:可以进行异常的处理
    在这里插入图片描述

2. Error

Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性 的代码进行处理。

3. Exception

Exception分为 " 编译时异常 "和 “运行时异常”

其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。

例如:

  1. 空指针访问
  2. 试图读取不存在的文件
  3. 网络连接中断
  4. 数组角标越界

4.异常处理机制一:try-catch-finally

try{
    //可能有问题的代码
    }catch(出现错误的类型   变量1){
    //处理异常的方式一
     String getMessage();
       printstackTrace();
    }catch(出现错误的类型   变量2){
        //处理异常的方式二
      String getMessage();
       printstackTrace();
    }catch(出现错误的类型   变量3){
        //处理异常的方式三
      String getMessage();
       printstackTrace();
    }
finally{
    //一定会执行的代码
    }
  1. finally是可选的。
  2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
  3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的 try-catch结构(在没有写finally的情况)。继续执行其后的代码
  4. catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
    catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
  5. 常用的异常对象处理的方式:
    String getMessage()
    printstackTrace()

有关finally的说明:

  1. finally是可选的
  2. finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。
  3. 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的 释放。 此时的资源释放,就需要声明在finally中。

5.异常处理机制二:throws+异常类型

  1. "throws +异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。
    一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throwS后异常类型 时,就会被抛出。异常代码后续的代码,就不再执行!
  2. 体会: try-catch-finally:真正的将异常给处理掉了。
    throws的方式只是将异常抛给了方法的调用者。并没有真正将异常处理掉。

6. try-catch和throws的区别

  1. 体会:try-catch-finally:真正的将异常给处理掉了。
    throws的方式只是将异常抛给了方法的调用者。并没有真正将异常处理掉。

  2. 开发中如何选择使用try-catch-finally 还是使用trIows?

    • 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。
    • b.执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

7.手动抛出异常对象throw

关于异常对象的产生:

  1. 系统自动生成的具常对象
  2. 手动的生成一个异常对象,并抛出(throw)

8.用户自定义异常类

如何自定义异常类?

  1. 继承于现有的异常结构:RuntimeException .Exception
  2. 提供全局常量:static final long serialVersionUID
  3. 提供重载的构造器

9.例题——分母相除

package text9;
//自定义异常类EcDef
//如何自定义异常类?

   // 1.继承于现有的异常结构:RuntimeException .Exception
public class EcDef  extends Exception {

    //2.提供全局常量:serialVersionUID
    static final long serialVersionUID =-12345678;

    //3.提供重载的构造器
    public EcDef() {
    }

    public EcDef(String message) {
        super (message);
    }
}
package text9;
//*编写应用程序EcmDef.java,接收"命令行"的两个参数,要求不能输入负数 计算两数相除。
//    对数据类型不一致(NumberFormatException)、缺少命令行参数(ArrayIndexOut0fBoundsException)
//    除e(ArithmeticException)及输入负数(EcDef自定义的异常)进行异常处理。
//    提示:
//  (1)在主类(EcmDef)中定义异常方法(ecm)完成两数相除功能。
//    (2)在main(()方法中使用异常处理语句进行异常处理。
//    (3)在程序中,自定义对应输入负数的异常类(EcDef)。
//    (4)运行时接受参数java EcmDef 20 10l/args[e]="20"angs[1]=“10”
//     (5)Interger类的static方法parseInt(Strings)将s转换成对应的int值
//    如: int a=Interger.parseInt("314"); a=314;
public class EcmDef {
    public static void main(String[] args) {
       //进行类型转换,String类型转换成int类型
       // 这里的数组可能会出错,所以进行异常处理
        try {
            int i = Integer.parseInt (args[0]);
            int j = Integer.parseInt (args[1]);
           int result= ecm (i, j);
            System.out.println ("-----");
            System.out.println (result);
        } catch (NumberFormatException e){
            System.out.println ("数据类型不一致");
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println ("缺少命令行参数");
        }catch(ArithmeticException e){
            System.out.println ("分母为0");
        }catch(EcDef e){
            //获取 EcDef错误中的信息
            System.out.println (e.getMessage ());
        }
    }
    public static int ecm(int i, int j) throws EcDef {
        if(i<0||j<0){
            //如果i或者j小于0,则抛出自定义的异常
            throw  new EcDef ("分子或者分母小于0了");
        }
        return i/j;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值