目录
一、异常的概念
二、异常的层次结构
1.Error
2.Exception
三、异常的捕获与处理
1.异常处理概念
2.异常捕获演示
代码1:除0异常
代码2:捕获异常
代码3:将代码2中的e.printStackTrace()删去
3.异常捕获详解
四、抛出异常
1.抛出异常的概念
2.throws语句
3.throw语句
五、自定义异常类
六、通过异常捕获管理系统中的输入值类型错误
七、通过自定义异常规范管理系统中的输入长度
八、异常处理嵌套
在使用计算机语言进行项目开发的过程中,某些问题不是靠代码能够避免的,比如客户输入数据的格式、读取文件是否存在、网络是否始终保持通畅等。在Java语言中,将程序运行期间发生的不期而至的各种意外状况成为异常,如文件找不到、网络连接失败、非法参数等。
Java通过API中的Throwable类的众多子类描述各种不同的异常,所以Java异常是Throwable子类的实例化对象。 Throwable有两个重要的子类:Exception(异常)和Error(错误)。
Error代表程序运行时Java系统内部的错误,与程序设计者操作无关。Error不可查也不必处理。
Exception通常是由某个资源不可用或者正确执行程序所需的条件不满足所造成的,是程序本身可以处理的异常。
Java将异常分为两类:运行时异常(RuntimeException,也称为未检查异常)和非运行时异常(也成为已检查异常)。运行时异常包含Java.Lang.RuntimeException类及所有子类,除此以外的属于Exception类及其子类的所有异常都属于非运行时异常。
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//异常处理方式1
}catch(异常类型2 变量名2){
//异常处理方式2
}finally{
//一定会执行的代码
}
try-catch-finally的做法是将程序的业务功能代码放在try语句中,尝试是否能够顺利通过,将异常代码放在catch语句中,捕获并处理异常,try-catch协同工作,这是Java的异常处理方式。
public class Test {
public static void main(String[] args) {
division(10, 0);
}
private static void division(int a, int b) {
System.out.println(a / b);
}
}
运行结果:
public class Test {
public static void main(String[] args) {
try {
division(10, 0);
} catch (ArithmeticException e) {
System.out.println("有异常");
e.printStackTrace();// 打印终端中的java.lang.ArithmeticException: / by zero ……
} finally {
System.out.println("异常已经被捕获");
}
}
private static void division(int a, int b) {
System.out.println(a / b);
}
}
运行结果:
public class Test {
public static void main(String[] args) {
try {
division(10, 0);
} catch (ArithmeticException e) {
System.out.println("有异常");
} finally {
System.out.println("异常已经被捕获");
}
}
private static void division(int a, int b) {
System.out.println(a / b);
}
}
运行结果:
(1)try
(2) catch
(3)finally
如果当前方法不知道如何处理捕获的异常,用throws声明将此异常再次抛出,交给当前方法的上一层调用者;假设上一层方法仍然不知道如何处理,也可以继续向上抛出;直到某个方法可以处理此异常,或者最终交给JVM。异常对象沿着方法调用链进行反向传递,JVM对异常处理方法是打印异常的跟踪信息栈,并终止程序异常。
throws在声明方法时,表示该方法可能要抛出异常,调用者必须做出处理,捕获或继续抛出异常。
public class Test {
public static void main(String[] args) throws NullPointerException{
//使用throws抛出NullPointerException异常
}
}
throw用于用户自定义的异常抛出
throw 异常对象;
public class MyException extends Exception {
public MyException() {
}
public MyException(String msg) {
super(msg);
}
}
public class Test {
public static void main(String[] args) throws MyException {
UseException useException = new UseException();
try {
useException.division(10, 0);
} catch (MyException e) {
e.printStackTrace();
} finally {
System.out.println("异常已经被捕获");
}
}
}
public class UseException {
public void division(int a, int b) throws MyException {
if (b == 0) {
throw new MyException("/ by zero");
} else {
System.out.println(a / b);
}
}
}
代码演示:
public class Student {
int id;
String name;
public void setId(int id) {
this.id = id;
}
public int getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Add {
public static void add(ArrayList students) {
Scanner in = new Scanner(System.in);
try {
System.out.println("请输入要添加的学生学号:");
int id = in.nextInt();
System.out.println("请输入要添加的学生姓名:");
String name = in.next();
Student student = new Student(id, name);
students.add(student);
System.out.println("添加成功!");
} catch (InputMismatchException e) {
System.out.println("输入类型错误");
}
}
}
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList students = new ArrayList();
Add.add(students);
}
}
代码演示:
public class MyException extends Exception {
public MyException() {
}
public MyException(String msg) {
super(msg);
}
}
public class LengthTest {
public void nameLength(String a) throws MyException {
if (a.length() > 10) {
throw new MyException("输入名字过长");// 当传入的字符串长度大于10,抛出自定义异常
}
}
}
public class Student {
int id;
String name;
public void setId(int id) {
this.id = id;
}
public int getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class Add {
public static void add(ArrayList students) {
Scanner in = new Scanner(System.in);
try {
System.out.println("请输入要添加的学生学号:");
int id = in.nextInt();
System.out.println("请输入要添加的学生姓名");
String name = in.next();
LengthTest lengthTest = new LengthTest();
lengthTest.nameLength(name);
Student student = new Student(id, name);
students.add(student);
System.out.println("添加成功!");
} catch (MyException e) {
e.printStackTrace();
}
}
}
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws MyException {
ArrayList students = new ArrayList();
Add.add(students);
System.out.println(students.get(0).getName());
}
}
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Add {
public static void add(ArrayList students) {
Scanner in = new Scanner(System.in);
try {
System.out.println("请输入要添加的学生学号:");
int id = in.nextInt();
System.out.println("请输入要添加的学生姓名");
String name = in.next();
LengthTest lengthTest = new LengthTest();
lengthTest.nameLength(name);
Student student = new Student(id, name);
students.add(student);
System.out.println("添加成功!");
} catch (MyException e) {
e.printStackTrace();
} catch (InputMismatchException e) {
// e.printStackTrace();
System.out.println("输入值类型错误");
}
}
}