美文网首页
Java学习7-异常处理

Java学习7-异常处理

作者: 持之以蘅 | 来源:发表于2019-06-23 20:07 被阅读0次

    异常原因分类

    • 用户输入了非法数据
    • 要打开的文件不存在
    • 网络通信时连接中断,或者JVM内存溢出
      so JVM是什么???

    三种类型的异常

    • 检查性异常:
    • 运行性异常:
    • 错误:

    EXception类的层次

    • 所有异常类是java.lang.Exception类的继承的子类
    • Exception类是Throwable类的子类,Error也是子类;
    • 异常类有两个主要的子类:IOException类和RuntimeException类


      image.png

    Java内置异常类

    • 非检查性异常


      image.png
    • 检查性异常


      image.png
    异常方法
    • Throwable类的主要方法


      image.png

    捕获异常

    • try和catch关键字可以捕获异常;try/catch代码块放在异常可能发生的地方,里面的代码称为保护代码;
    try
    {
    //程序代码
    }catch(ExceptionName e1)
    {
    //Catch 块
    }
    
    • Catch语句包含要捕获异常类型的声明
    • 当保护代码发生一个异常时,try后买你的catch块就会被检查;
    • 如果发生的异常包含在catch块中,异常会被传递到该catch块,这和传递一个参数到方法是一样的。
    import java.io.*;
    
    public class ExcepTest {
    
        public static void main(String args[]){
            try{
                int a[] = new int[2];
                System.out.println("Access element three:"+ a[3]);
            }catch (ArrayIndexOutOfBoundsException e){
                System.out.println("Exception thrown :" + e);
            }
            System.out.println(("Out of the block"));
        }
    }
    
    • 结果


      image.png

    多重捕获块

    try{
       // 程序代码
    }catch(异常类型1 异常的变量名1){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }
    
    • 可以在try语句后面添加任意数量的catch块
    • 如果保护代码发生异常,异常被抛给第一个catch块
    • 如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
    • 如果不匹配,它会被传递给第二个 catch 块。
      如此,直到异常被捕获或者通过所有的 catch 块。

    tthrows/throw关键字

    • 一个方法没有捕获到一个检查性异常,那么该房啊发必须使用throws关键字来声明
    • throw关键字放在方法签名的尾部
    • 可以使用throw关键字来抛出一个异常
    • 下例为RomoteException异常
    import java.io*
    public class className
    {
    public void deposit(double amout) throws RometeException
    {
    //Methods iplementation
    throw new Remoteexception():
    }
    //Remainder of class definition
    }
    
    • 一个方法可以抛出多个异常,多个异常之间用逗号隔开

    finally关键字

    • 用来创建在try代码块后面执行的代码块
    • 无论异常是否发生,finally代码块中的代码总会被执行
    • 在finally代码块中,可以运行清理类等收尾善后性质的语句
    • finally代码块出现在catch代码块最后
    try{
      // 程序代码
    }catch(异常类型1 异常的变量名1){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }finally{
      // 程序代码
    }
    
    public class ExcepTest{
      public static void main(String args[]){
        int a[] = new int[2];
        try{
           System.out.println("Access element three :" + a[3]);
        }catch(ArrayIndexOutOfBoundsException e){
           System.out.println("Exception thrown  :" + e);
        }
        finally{
           a[0] = 6;
           System.out.println("First element value: " +a[0]);
           System.out.println("The finally statement is executed");
        }
      }
    }
    
    • 结果


      image.png
    • 添加finally块并非强制性要求
    • try、catch、finally块之间不能添加任何代码

    声明自定义异常

    • 所有异常都必须是 Throwable 的子类。
    • 写一个检查性异常类,则需要继承 Exception 类。
    • 一个运行时异常类,那么需要继承 RuntimeException 类。
    class MyException extends exception{
    }
    
    • 只继承Exception 类来创建的异常类是检查性异常类。
    • 例子:InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。
    // 文件名InsufficientFundsException.java
    import java.io.*;
     
    //自定义异常类,继承Exception类
    public class InsufficientFundsException extends Exception
    {
      //此处的amount用来储存当出现异常(取出钱多于余额时)所缺乏的钱
      private double amount;
      public InsufficientFundsException(double amount)
      {
        this.amount = amount;
      } 
      public double getAmount()
      {
        return amount;
      }
    }
    
    • 一个 withdraw() 方法抛出一个 InsufficientFundsException 异常。
    import java.io.*;
     
    //此类模拟银行账户
    public class CheckingAccount
    {
      //balance为余额,number为卡号
       private double balance;
       private int number;
       public CheckingAccount(int number)
       {
          this.number = number;
       }
      //方法:存钱
       public void deposit(double amount)
       {
          balance += amount;
       }
      //方法:取钱
       public void withdraw(double amount) throws
                                  InsufficientFundsException
       {
          if(amount <= balance)
          {
             balance -= amount;
          }
          else
          {
             double needs = amount - balance;
             throw new InsufficientFundsException(needs);
          }
       }
      //方法:返回余额
       public double getBalance()
       {
          return balance;
       }
      //方法:返回卡号
       public int getNumber()
       {
          return number;
       }
    }
    
    • 调用 CheckingAccount 类的 deposit() 和 withdraw() 方法。
    public class BankDemo
    {
       public static void main(String [] args)
       {
          CheckingAccount c = new CheckingAccount(101);
          System.out.println("Depositing $500...");
          c.deposit(500.00);
          try
          {
             System.out.println("\nWithdrawing $100...");
             c.withdraw(100.00);
             System.out.println("\nWithdrawing $600...");
             c.withdraw(600.00);
          }catch(InsufficientFundsException e)
          {
             System.out.println("Sorry, but you are short $"
                                      + e.getAmount());
             e.printStackTrace();
          }
        }
    }
    
    • 结果
      好像又出现导入文件错误了


      image.png

    最后

    • JVM即Java虚拟机,

    相关文章

      网友评论

          本文标题:Java学习7-异常处理

          本文链接:https://www.haomeiwen.com/subject/eozvqctx.html