Java 基础知识——异常处理
文章目录
回顾:
Java 基础知识——基础语法
Java 基础知识——类与对象
Java 基础知识——抽象类、接口和内部类
Java 基础知识——泛型
一、 异常分类
错误: Error类以及他的子类的实例,代表了 JVM 系统内部错误、资源耗尽等严重情况。是脱离程序员控制的问题。因此,程序员应该关注Exception为父类的分支下的各种异常类。错误在代码中通常被忽略。例如:
当栈溢出时,一个错误就发生了,它们在编译是检查不到的。
运行时异常: 是指 编译器不要求强制处置的异常, 可以在编译时被忽略。运行时异常是可能被程序员避免的异常。示例:
空指针访问异常、除以 0 溢出异常、数组下标越界异常、错误类型转换异常。
检查型异常: 是指 编译器要求必须处置的异常, 最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。示例:
访问不存在文件的异常、找不到指定名称类的异常、操作数据库时异常、操作文件时异常。
Exception以及子类。
二、 异常捕获处理 (try-catch-finally)
Java的异常处理是通过5个关键字来实现的:try
监视检测、catch
捕获处理、 finally
总要被执行、throw
、throws
(抛出异常)。
捕获异常
try:执行可能产生异常的代码。
catch:捕获异常。
finally:无论是否发生异常,代码总能执行。
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
1、异常的处理
import java.util.Scanner;
/**
* 使用try-catch-finally进行异常处理。
*/
public class Test4 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
try {
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d",
num1, num2, num1/ num2));
} catch (Exception e) {
System.err.println("出现错误:被除数和除数必须是整数," +
"除数不能为零。");
System.out.println(e.getMessage());
//System.exit(1); // finally语句块不执行的唯一情况
} finally {
System.out.println("感谢使用本程序!");
}
}
}
2、多重 catch 异常处理
多重catch异常要求:子类在前、父类在后、平级均可。
import java.util.Scanner;
import java.util.InputMismatchException;
/**
* 多重catch块。
*/
public class Test7 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
try {
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d",
num1, num2, num1/ num2));
} catch (InputMismatchException e) {
System.err.println("被除数和除数必须是整数。");
} catch (ArithmeticException e) {
System.err.println("除数不能为零。");
} catch (Exception e) {
System.err.println("其他未知异常。");
} finally {
System.out.println("感谢使用本程序!");
}
}
}
3、嵌套异常处理
try {
try {
......
} catch {
......
}
} catch {
......
}
4、finally 关键字
finally 关键字必须和 try 结合使用,不可单独使用。表示无论成功与否都要执行的代码,常用使用方法有: try-finally
,try-catch-finally
。
public void method(){
try {
// 代码段
// 产生异常的代码段
// 代码段
} catch (异常类型 ex) {
// 对异常进行处理的代码段
} finally {
// 总要执行的代码段
}
}
三、 声明抛出异常 (throws、throw)
throws 声明抛出异常: 声明方法可能要抛出的各种异常。
不知道目前如何处理所出现的异常,可在定义方法时,声明抛出(throws)异常。即一个方法可能引发异常,而它本身不对该异常处理,那么该方法必须声明将这个异常抛出,使得程序能够继续执行下去。
public static void throwChecked(int a) throws Exception // 抛出异常
{
if (a > 0)
{
// 自行抛出Exception异常
// 该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
throw 手动抛出异常
throw 用来明确地抛出一个异常。用户必须得到一个 Throwable 类或其他子类产生的对象引用。
示例:
public class Person {
private String name = ""; // 姓名
private int age = 0; // 年龄
private String sex = "男"; // 性别
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
else {
throw new Exception(“性别必须是\"男\"或者\"女\"!");
}
}
}
在实际应用中,一般需要 throw
和 throws
语句组合应用,可在捕获异常后,抛出一个明确的异常给调用者。throws 语句编写在方法签名之后,throw 语句编写在方法之中。且 throws
抛出异常的范围要大于等于throw
异常的范围。