java异常处理

什么是异常?
异常就是表示阻止执行正常进行的错误或者情况

一、 try-catch语句

import java.util.Scanner;

public class Quotient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Scanner input = new Scanner(System.in);
      System.out.println("Enter two integer:");
      int number1 = input.nextInt();
      int number2 = input.nextInt();
      // try在程序正常时运行
      try{
          if (number2 == 0) throw new ArithmeticException("Divisor cannot be zero"); // throw执行时会调用catch
          int result = number1 / number2;
          System.out.println(result);
      }
      // catch 包含在程序异常时产生执行,即number2=0时;
      catch (ArithmeticException ex){
          // catch参数匹配抛出值的类型,这里是ArithmeticException类型
          System.out.println("cannot be divided by zero");
      }
      System.out.println("Execution continues..."); 
    }
}

当输入20时,输出Enter two integer:
3
0
cannot be divided by zero
Execution continues...


try块是程序正常运行的情况,catch是在number = 0时,运行的代码;
在try块中,通过条件判断是否直接抛出异常,或者调用一个可能抛出异常的方法throw;
直接抛出异常: throw new ArithmeticException(“Divior cannot be zero”);
异常是通过异常类产生的新的对象,这里,异常类就是 java.lang.ArithmeticException;
当异常抛出后,正常的执行流程就被中断了,异常将被catch捕获,执行catch中的代码段;
在catch块中,catch(ArithmeticException e)
ex为catch块的参数,它的类型是try抛出异常的类型,一旦捕获异常,catch块就能通过ex参数访问抛出的异常值;


二、在try块调用可能产生异常的方法

在自定义方法中产生异常:

import java.util.Scanner;

public class Quotient {

    public static int quotient(int number1, int number2){
         // try在程序正常时运行
              if (number2 == 0) throw new ArithmeticException("Divisor cannot be zero"); // throw执行时会调用catch
              int result = number1 / number2;
              return result;
          }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Scanner input = new Scanner(System.in);
      System.out.println("Enter two integer:");
      int number1 = input.nextInt();
      int number2 = input.nextInt();
      try{
      int result = quotient(number1, number2);
      System.out.println(result);
      }
      // catch 包含在程序异常时产生执行,即number2=0时;
      catch (ArithmeticException ex){
          // catch参数匹配抛出值的类型,这里是ArithmeticException类型
          System.out.println("cannot be divided by zero");
      }
      System.out.println("Execution continues..."); 
    }
}

在库方法中抛出异常:

  • FileNotFoundException异常
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileNotFoundExceptionDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       Scanner inputFromConsole = new Scanner(System.in);
       System.out.println("enter a file name");
       String fileName = inputFromConsole.nextLine();
       try {
           Scanner inputFromFile = new Scanner(new File(fileName));//如果文件不存在,那么,Scanner会抛出FileNotFundException类型的异常,并且被将会被catch捕获
           System.out.println("File" + fileName + "exists");
       }
       // 捕获FileNotFoundException类型的异常
       catch(FileNotFoundException ex){
           System.out.println("Exception:" + fileName + " not found");
       }
    }
}

输出结果:

// 文件存在,未抛出错误
 enter a file name
/Users/shaojinghong/Desktop/java/日记1.txt
File/Users/shaojinghong/Desktop/java/日记1.txtexists

//文件不存在,抛出错误
enter a file name
/Users/shaojinghong/Desktop/java/日记1
Exception:/Users/shaojinghong/Desktop/java/日记1 not found


- InputMismatchException异常

import java.util.InputMismatchException;
import java.util.Scanner;

public class InputMismatchExceptionDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Scanner input = new Scanner(System.in);
      boolean continueInput = true;
      do {
          try{
              System.out.print("Enter an integer");
              int number = input.nextInt();// 如果,输入不是int类型,将抛出异常
              System.out.println("the number entered is a number");
              continueInput = false;
          }
          catch (InputMismatchException ex){
              System.out.println("Incorrect input: an integer is required");
              input.nextLine();//丢弃当前行,用户可以输入新行
          }
      } while (continueInput);  
    }
}


三、异常类型

异常可分为三类

  • 系统错误Error:LinkageError、VirtualMachineError等
    由java虚拟机抛出,用Error表示,发生这种错误时,几乎什么都不做,除了通知用户、尽量稳妥的终止任务;例如,编译前后变得不兼容java虚拟机中断,或者没有继续运行所必须的资源可用

  • 异常 Exception: ClassNotFoundException、IOException
    由程序和外部情况引起,可以被捕获处理;当企图使用一个不存在的类的时候,会抛出ClassNotFoundException;当OI操作时,无效的输入和打开一个不存在的文件、读取超过文件尾部、会抛出IOException,它包的含子类有:InterruptedIOException、EOFException、FileNotFoundException

  • 运行时异常runtime exception:描述的是程序设计的错误,被java虚拟机抛出,例如:错误的类型转换、访问一个越界数组RuntimeException有以下子类:ArithmeticException(一个数除以0)、NullPointerException(企图通过Null访问一个对象)、 IndexOutBoundsException(数组下标超出范围)、IllegalArgumentException(传递参数不合法)

    这里写图片描述



四、免检、必检异常

RuntimeException和Error和它们的子类都是免检异常,
Exception异常是必检异常,意思是编译器会强制程序猿检查并处理异常;
大多数情况下,免检对象反应出程序设计的错误,例如,数组越界,这些都是程序猿必须纠正的语法错误,为了避免过多的使用try-catch语句,java语言不允许编写代码捕获或者声明免检异常



五、深入异常处理的细节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值