文章目录
- 1、异常处理概述
- 2、异常的分类
- 3、异常的捕获处理
- 4、重新抛出异常
- 5、定义新的异常类型
- 6、异常编程例题
1、异常处理概述
三类程序错误:
- 编译错误–因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置;
- 运行时错误–因为程序在执行时,运行环境发现了不能执行的操作;
- 逻辑错误–因为程序没有按照预期的顺序和逻辑执行。
异常——程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等。如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。
异常处理机制——当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
★ 掌握和编写异常处理机制程序:找到异常出现的逻辑、使用完整的数据测试、形成有针对性的异常处理。
2、异常的分类
Throwable是所有异常的共同祖先,异常都是从Throwable继承而来的。Throwable有两个子类,Error和Exception。
① Error是错误,表示运行应用程序中出现了严重的错误,都是通过Error抛出的,一般是程序不能处理的系统错误。错误是没法处理的。
Error类包括一些不能被程序员处理的严重的系统错误类,共有12个直接子类,一般表示代码运行时 JVM(Java 虚拟机)出现的问题,如内存溢出、虚拟机错误、栈溢出等。这类错误与硬件有关,大多数错误与代码编写者执行的操作无关,通常由系统进行处理,程序本身无法捕获和处理。如:当JVM耗完可用内存时,将出现OutOfMemoryError。如Java虚拟机运行错误,将出现VirtualMachineError、类定义错误将出现NoClassDefFoundError等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
② Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的错误。异常是可以被处理的!
常见的异常有:
输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException
3、异常的捕获处理
finally{ }语句块无论是否发生异常,都将被执行。它是整个捕获异常组合语句的出口,可以用来“善后”,如:释放资源、关闭文件。它是可选的操作。
异常:程序运行时,程序本身可以捕获并且可以处理的错误。
异常分为:
①运行时异常(不受检异常),一般由程序逻辑错误引起。不要求必须处理,编译器不检查。它是JVM在运行期间可能出现的错误,如数组越界、空值对象引用。
②非运行时异常(受检异常),比如IOException,必须处理!处理方式有两种:一是try-catch捕获,二是使用throws语句抛出。否则无法编译。
- 使用throws语句抛出异常
- 使用try-catch语句捕获异常
★ 存在多个异常时:异常的产生是由语句中的异常顺序来决定的!
捕捉到第一个异常语句以后,就不会再执行该语句的后续语句了~
例如——下图代码,捕捉到数组定义时开辟的数量为负数,错误,抛出该错误,不再执行下面的语句,所以没有捕捉到除以0的错误。
try-catch-finally语句发生多重嵌套时,先去执行内层的语句;捕捉好内层的异常之后,再来执行靠外层的语句,捕捉异常。例如:
★ eclipse中写异常语句——
4、重新抛出异常
重新抛出异常包括throw和throws两种语句。
下图代码中: throw语句明确抛出了一个空指针异常,改变了程序的执行流程(它后面的语句执行不到!!!),程序跳转到相应的异常处理语句中执行。
throw new NullPointerException(参数);
何时抛出异常???
下面是 throws语句 ——注意看这张图的概念:
5、定义新的异常类型
系统已经给定的那些异常适用于大部分情况,但还要特定的情况需要自己定义新的异常类型。
自定义异常类的步骤:
例子1:银行业务新编写的一个异常类:BankException
银行类:Bank
主函数:
例子2:货船装载
6、异常编程例题
第一题:货船装载问题
import java.util.Scanner;
class DangerException extends Exception {
//starts
final String message = "超重";
public String warnMess() {
return message;
}
//end
}
class CargoBoat {
int realContent; //装载的重量
int maxContent; //最大装载量
public void setMaxContent(int c) {
maxContent = c;
}
public void loading(int m) throws DangerException {
//starts
realContent += m;
if(realContent>maxContent) {
throw new DangerException();
}
System.out.println("目前装载了"+realContent+"吨货物");
//end
}
}
public class Main {
public static void main(String args[]) {
CargoBoat ship = new CargoBoat();
Scanner s=new Scanner(System.in);
ship.setMaxContent(1000);
int m=0;
try{
//starts
while("".equals(s)==false)
{m = s.nextInt();
ship.loading(m);
}
//end
}
catch(DangerException e) {
//starts
System.out.println(e.warnMess());
System.out.println("无法再装载重量是"+m+"吨的集装箱");
//end
}
finally {
System.out.printf("货船将正点启航");
}
}
}
第二题
import java.util.Scanner;
public class Main {
public static void main(String[] args){
//write code here
Scanner in = new Scanner(System.in);
try{
int m = Integer.parseInt(in.next());
System.out.println(10-m);
}
catch(NumberFormatException e){
System.out.println("not int");
}
finally {
System.out.printf("end");
}
}
}