Java-异常处理

程序错误

编译错误

因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。

运行时错误

因为程序在执行时,运行环境发现了不能执行的操作。

逻辑错误

因为程序没有按照预期的顺序和逻辑执行。

异常

在这里插入图片描述

程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等。
如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。
异常处理机制就是指当程序出现错误后,程序如何处理。
具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
在这里插入图片描述

Throwable是所有异常的共同祖先,异常都是从Throwable继承而来的。Throwable有两个子类,Error和Exception。
Error是错误,表示运行应用程序中出现了严重的错误,都是通过Error抛出的,一般是程序不能处理的系统错误。
Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的错误。

异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。

Error类包括一些不能被程序员处理的严重的系统错误类,共有12个直接子类,一般表示代码运行时 JVM(Java 虚拟机)出现的问题,如内存溢出、虚拟机错误、栈溢出等。
这类错误与硬件有关,大多数错误与代码编写者执行的操作无关,通常由系统进行处理,程序本身无法捕获和处理。
如:当JVM耗完可用内存时,将出现OutOfMemoryError。如Java虚拟机运行错误,将出现VirtualMachineError、类定义错误将出现NoClassDefFoundError等。
这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。

运行时异常(不受检异常) – RuntimeException类及其子类:表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求必须处理异常。
如:空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
非运行时异常(受检异常) --除RuntimeException及其子类之外的异常,如果程序中出现此类异常,如IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException
try {   ...  
//监视代码执行过程,一旦返现异常则直接跳转至catch,
// 如果没有异常则直接跳转至finally} 
catch (ExceptionType ExceptionObject) {   
 //可选执行的代码块,如果没有任何异常发生则不会执行;
 //如果发现异常则进行处理或向上抛出。} 
finally { 
 //可选执行的代码块,不管是否有异常发生,
 //即使内存溢出异常也执行,通常用于处理善后清理工作。}
try {	
	// 可能会发生异常的程序代码		}
catch (Type1 id1) {
	// 捕获并处理try抛出的异常类型Type1	
} catch (Type2 id2) { // 在try后面可以跟多个catch。
	// 捕获并处理try抛出的异常类型Type2	
} finally {
	// 无论是否发生异常,都将执行的语句块	
}

运行时异常只有运行时才会出现,将出现异常的语句使用try- catch-finally结构包裹即可。

int a=10,b=0,x=0;
try {
	x=a/b;
	System.out.println(x);
} catch (ArithmeticException e) {
	e.printStackTrace();
}
// 等价于
int a=10,b=0,x=0;
if (b!=0) {
    x = a / b;
    System.out.println(x);
}
else
    System.out.println("b=0");

存在多个异常的时候。异常的产生是由于语句中的异常顺序决定的。

int a=10,b=0,x=0;
try {
	int y[]=new int[-2];
	x=a/b;
	System.out.println(x);
}catch (ArithmeticException e) {
	e.printStackTrace();
}catch (NegativeArraySizeException e) {
	e.printStackTrace();
}
// 首先发现异常的是越界,然后将catch,try中的语句不再执行。

try-catch-finally语句的嵌套
Java语言的try-catch-finally语句可以嵌套,即在try块中可以包含另外的try-catch-finally语句。

try{ 
    嵌套外层代码
    try{ 嵌套内层代码 }
    catch(ExceptionType1 ExceptionObject1){
           处理内层异常   }
    finally {内层出口}
 } 
catch(ExceptionType2 ExceptionObject2)
    {处理外层异常 }
finally {外层出口}

Throwable类中的常用方法

getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
getMeage():返回异常的消息信息。
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
toString():获取异常类名和异常信息(即简单的异常信息描述)

自定义异常类

银行的异常类的定义。

public class BankExcpetion extends Exception{
    String message;
    public BankExcpetion(int m, int n) {
        message = "Error";
    }
    public String warnMess (){
        return message;
    }
}
public class Bank {
    int now;
    public void income (int in, int out) throws BankExcpetion{
        if(in < 0 || out > 0)
        throw new BankExcpetion(in, out);
        int income = in + out;
    }
}
class app {
    public static void main(String[] args) {
        Bank bank = new Bank();
        try {
            bank.income(100,-200);
            bank.income(50,50);
        }catch (BankExcpetion e) {
            System.out.println(e.warnMess());
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值