java异常

异常继承体系结构

  • Throwable类是JAVA语言中所有错误或异常的超类
Error

代表JVM本身的错误或发生在JVM试图运行程序时,不希望被程序捕获,不能被代码处理,而且很少出现。不是我们关注的重点。

  • JVMError
    • StackOverFlowError
    • 形成原因:死循环或无穷递归
    • OutOfMemoryError 内存溢出
    • 形成原因:加载数据量庞大等
Exception

异常层次结构的根类。异常处理的核心。

  • RuntimeException(UnCheckedException)
  • 运行时异常。对于这类异常,我们应修正代码,而不是通过异常处理器处理。
异常描述
ArithmeticException异常的运算条件。如:除零异常
ArrayIndexOutOfBoundsException非法索引访问数组异常。如:索引为负或大于等于数组大小
IllegalArgumentException向方法传递不合法或不正确的参数异常。
NullPointerException空指针异常。
NumberFormatException将字符串转换成不适当的类型的异常。
ArrayStoreException错误类型对象存储到一个对象数组异常。
IllegalStateException非法或不适当的时间调用方法时产生的异常。即JAVA环境或应用程序没有处于请求所要求的适当状态下。
IllegalThreadStateException线程没有处于请求所要求的适当状态时的异常。
IndexOutOfBoundsException某排序索引(数组、字符串或向量)超出范围异常
NegativeArraySizeException创建大小为负的数组的异常。
SecurityException安全管理器抛出的异常。
StringIndexOutOfBoundsException字符串索引为负或超出长度的异常。
  • NonRuntimeException(CheckedException)
  • 非运行时异常,JAVA强制要求为这样的异常做处理工作(try-catch-finally 或 throws),否则编译不会通过。这种异常一般由程序的运行环境导致,因为程序可能运行在未知环境下,应该为这样的异常时刻准备着。
异常描述
SQLException操作数据库异常
IOExceptionIO异常的根类
EOFException文件结束异常
FileNotFoundException找不到文件异常
InterruptedException线程中断异常。
ClassCastException类型转换异常
CloneNotSupportedException该对象类无法实现Cloneable接口的异常。
IllegalAcessException拒绝访问类的异常。
InstantiationException由于类对象是接口或抽象类无法实例化抛出的异常。
NoSuchFeildException请求变量不存在的异常。
NoSuchMethodException请求方法不存在异常。
自定义异常
  • 所有异常都必须为Throwable的子类。
  • 检查类异常则继承Exception类。
  • 运行时异常则继承RuntimeException类。

例1:IOException源码

public class IOException extends Exception
{
	static final long serialVersionUID=7818375828146090155L;
	//无参构造
	public IOException()
	{
		super();
	}
	//String为参数的构造
	public IOException(String message)
	{
		super(message);
	}
	//String,Throwable为参数的构造
	public IOException(String message,Throwable cause)
	{
		super(message,cause);
	}
	//Throwale为参数的构造
	public IOException(Throwable cause)
	{
		super(cause);
	}
}

例2:NullPointerException源码

package java.lang;
public class NullPointerException extends RuntimeException {
    private static final long serialVersionUID = 5162710183389028792L;
    public NullPointerException() {
        super();
    }
    public NullPointerException(String s) {
        super(s);
    }
}

异常处理

- try…catch…finally语句块

try {
	//可能发生异常的程序代码
	//若无异常,则执行finally语句块
	//若发生异常,则匹配catch语句块
} catch(Exception e1){
	//每个catch块用于捕获并处理一个特定异常。
	//定义异常类型和异常参数。按顺序匹配
	//若try块中发生的异常在后续的catch中均未捕获,
	//则先执行finally,然后到函数外部caller中匹配异常处理器。
	//try块中若无异常,则所有的catch块将被忽略。
} catch(Exception e2){
	
} finally{
	//可选
	//**必定会执行**
	//一个try块至少有一个catch块或finally块,
	//但finally不是处理异常的,不会捕获异常。
	//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}

notice:

  • try,catch,finally中局部变量(包括异常变量)不可共享。
  • 函数的某条语句发生异常时,这条语句后面的语句不会再执行,而是转去匹配的catch块执行,异常处理完成,执行流会接着处理了这个异常的catch块后执行。

例:

public static void main(String[] args){
	int result = test();
	System.out.println(result);
}

public static int test(){
	int i = 1;
	try{
		i++;
		System.out.println("try block, i="+i);
		return i;
	}catch(Exception e){
		i++;
		System.out.println("catch block, i="+i);
		return i;
	}finally{
		i = 10;
		System.out.println("finally block, i="+i);
		return i;
	}
}
输出结果为:
try block, i=2
finally block, i=10
10

- throws函数声明及throw异常抛出语句

  • 抛出异常,而方法无法自己完全处理掉。仅仅向函数中可能出现的异常向调用者声明,自己不具体处理。
  • 采取这种异常处理的原因是:方法本身不知如何处理这种异常,或者让调用者处理更好,调用者需为可能发生的异常负责。
public void function() throws ExceptionType1 e1, ExceptionType2 e2
{
	//内部可抛出ExceptionType1,ExceptionType2类的异常
	//或他们子类的异常对象
	if(user == null){
		throw new ExceptionType1("user is null");
	}
}

常用的输出异常的函数:

  • getMessage()方法,Exception类方法之一,返回异常原因
  • printStackTrace()方法,Exception类方法之一,输出函数栈信息,即异常出现位置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值