异常处理允许一个程序处理异常情况从而继续正常运行。
Runtime error指编译器在运行中发现了无法执行的代码,如数组越界,输入数据类型不匹配等。Runtime error会输出一个Exception。如果Exception未解决程序将会中断
package chapter12;
import java.util.*;
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 integers");
int number1 = input.nextInt();
int number2 = input.nextInt();
System.out.println(number1 / number2);
}
}
如果输入number2为0,会出现一个expection。此处可以先使用一个if语句判断number2是否为0,不为0再计算。但是如果这么做一旦输入number2为0程序将会自动停止,无法实现用户自己决定是否停止。
按如下方法编写
package chapter12;
import java.util.Scanner;
public class QuotientWithException {
public static int quotient(int number1, int number2) {
if (number2 == 0) {
throw new ArithmeticException("Divisor cannot be zero");
}
return number1 / number2;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
for (int i = 0; i < 5; i++) {
System.out.println("Enter two integers");
int number1 = input.nextInt();
int number2 = input.nextInt();
try {
int result = quotient(number1, number2);
System.out.println(result);
} catch (ArithmeticException ex) {
System.out.println("Cannot be divided by zero");
}
System.out.println("continue....");
}
}
}
在函数quotient中,throw抛出了一个异常ArithmeticException。这新建了一个异常对象。
主方法里try部分执行正常运行状态下的代码,一旦抛出异常,catch部分就会接收到,然后执行catch部分的代码。try……catch语句外的执行程序不受影响
可以把throw,catch部分抽象理解为一个函数,throw调用此函数,catch部分为函数主题,其中catch的异常为传入的对象参数
使用异常处理语句的好处是不需要在程序中预先编写预防各类异常的代码,而只需要为可能出现的各种异常提供解决方案即可。
如下为另一个使用异常处理的例子,该程序实现了对InputMismatchException的解决
在这里插package chapter12;
import java.util.*;
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.println("Enter an integer:");
int number = input.nextInt();
System.out.println(number);
continueInput = false;
}
catch (InputMismatchException ex) {
System.out.println("Incorrect input, try again");
input.nextLine(); //discard current input, otherwise it causes an infinity loop
}
} while (continueInput);
}
}
入代码片