返回顶部
扩大
缩小

Yeap

java异常

[大部分内容来自菜鸟教程,自己过一下,加深记忆!]
Java异常要掌握一下三种类型:

  • 检查性异常: 最具代表的检查性异常是用户错误或者问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件是,一个异常就发生了,这些异常在编译时就不能忽略。
  • 运行时异常: 运行时异常时可能被程序员避免的异常。与检查行异常相反,运行时异常可以在编译中被忽略。
  • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们编译也检查不到。

Exception类的层次

所有的异常都继承从java.lang .Exception类继承。

Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error。

Java 程序通常捕获不到错误。错误一般发生在严重故障时。他们在程序处理的范畴之外。

Error用来指示运行时环境发生的错误。

异常类有两个主要的子类:IOException和RuntimeException类:

img

Java内置异常类

java语言定义类一些异常类在java.lang 包中。

Java根据各个类库定义类一些其他的异常。下面这些事Java中的非检查性异常。

image-20201130214758018

下面这些是java中的检查性异常:

image-20201130214900934

异常方法

以下这些是Throwable类的主要方法

image-20201130215256657

捕获异常

使用try和catch关键字可以捕获异常。try/catch代码放在异常可能发生的地方。

try/catch代码中的代码成为保护代码,使用try/catch的语法如下:

try{
    //程序代码
}catch(ExceptionName e){
    
    //catch  代码块
}

Catch语句包含要捕获的异常类型的声明,当保护代码中发生一个异常时,try后面的catch块就会被检查。如果发生异常的语句在catch中,异常就会传递到该catch块,这和传递以个参数到方法是一样的。

实例:一个下标越界的异常

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");
   }
}

//Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

多重捕获块

一个try代码块后面跟多个catch代码块的情况就多重捕获。

try{
   // 程序代码

}catch(异常类型1 异常的变量名1){ //如果保护代码中发生异常,异常被抛给第一个 catch 块。
  // 程序代码

}catch(异常类型2 异常的变量名2){//如果不匹配,它会被传递给第二个 catch 块。
  // 程序代码
}catch(异常类型3 异常的变量名3){//如此,直到异常被捕获或者通过所有的 catch 块。}catch(异常类型3 异常的变量名3
  // 程序代码
}

throws和trow关键字

如果一个方法没有捕获到一个检查行异常,那么该方法就必须用throws关键字来声明,throws关键字放在方法签名的尾部。也可以使用trow关键字抛出一个异常,那么无论它是新实例化的还是刚捕获的。

一个方法可以声明抛出多个异常,多个异常之间可以用逗号隔开。

finally关键字

finally关键字用来创建在try代码块后面执行的代码。

无论是否发生异常,finally代码块中的代码总会被执行。

在finally代码块中,可以运行清理类型等收尾等性质的语句。

finally代码块出现在catch代码块最后,

try{
  // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}finally{
  // 程序代码
}

声明自定义异常

在Java中可以自定义异常。

  • 所有异常都必须是trowable 的子类、
  • 写一个检查性异常,则需要继承Exception类。
  • 如果你想写一个运行时异常,那么需要继承RuntimeException类
class MyException extends Exception{
}

只继承Exception类来创建的异常时检查性异常。

 
//自定义异常类,继承Exception类
public class InsufficientFundsException extends Exception
{
  //此处的amount用来储存当出现异常(取出钱多于余额时)所缺乏的钱
  private double amount;
  public InsufficientFundsException(double amount)
  {
    this.amount = amount;
  } 
  public double getAmount()
  {
    return amount;
  }
}

在下面的 CheckingAccount 类中包含一个 withdraw() 方法抛出一个 InsufficientFundsException 异常。


//此类模拟银行账户
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;
   }
}

下面的 BankDemo 程序示范了如何调用 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();
      }
    }
}

运行后

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
        at CheckingAccount.withdraw(CheckingAccount.java:25)
        at BankDemo.main(BankDemo.java:13)

posted on 2020-11-30 22:24  YP泡泡  阅读(54)  评论(0)    收藏  举报

导航