什么是异常?
异常就是表示阻止执行正常进行的错误或者情况
一、 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...");
}
}
当输入2,0时,输出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语言不允许编写代码捕获或者声明免检异常