对比Exception和Error,运行时异常和一般异常

为什么要处理异常?

程序中一旦遇到异常就会结束程,异常之后的程序就不会执行了,并将错误报告给用户。eg:int i=1/0;就会产生异常。所以要保证程序能正常执行,就必须处理异常。

	public static void main(String[] args) {
		System.out.println("start");
		int i=1;
		int j=1;
		int temp=i/j;
		System.out.println("finish");
	}

Exception,Error都是继承了Throwable类,在java中只有Throwable的实例才可以被抛出或捕获。

Exception是指程序正常运行时,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Error是指在正常情况下不大可能出现的情况,大部分的Error都会导致程序处于非正常,不可恢复状态,既然是非正常情况,所以不便于也不需要捕获,eg:OutOfMemoryError,这是Error的子类。

java中异常分为两类:checked exception(检查异常)和unchecked exception(未检查异常),对于未检查异常也叫RuntimeException(运行时异常).

常见运行时异常

对于unchecked exception:可以不处理,因为不可控eg:Error

对于checked exception:必须进行处理,捕获或抛出。

=====================================================================================

1:assert:断言,在实际开发中并不常见。

2:throw and throws,

              #throw:抛出异常对象

             #throws:在方法声明处使用,表示此方法不处理异常,交给调用此方法调用处处理,有throws,调用时需要处理异常,或继续抛出

class Math{
	public int div(int i,int j) throws Exception{	// 定义除法操作,如果有异常,则交给被调用处处理
		System.out.println("***** 计算开始 *****") ;
		int temp = 0 ;	// 定义局部变量
		try{
			temp = i / j ;	// 计算,但是此处有可能出现异常
		}catch(Exception e){
			throw e ;
		}finally{	// 不管是否有异常,都要执行统一出口
			System.out.println("***** 计算结束 *****") ;
		}
		return temp ;
	}
};
public class ThrowDemo02{
	public static void main(String args[]){
		Math m = new Math() ;
		try{
			System.out.println("除法操作:" + m.div(10,0)) ;
		}catch(Exception e){
			System.out.println("异常产生:" + e) ;
		}
	}
};

3:Exception的异常必须处理,而RuntimeException的异常不处理的(但是最好处理)

     在开发中,try catch finally throw throws,是经常在一起使用的,eg:现在要设计一个相除的方法,但是在进行操作之前必须打印“*********计算开始**********”的信息,结束后打印“**********计算结束*******”的信息,如果有异常,则把异常交给调用处处理。代码如上面所示。

4:如果需要自定义异常,则直接继承Exception类即可。

class MyException extends Exception{	// 自定义异常类,继承Exception类
	public MyException(String msg){
		super(msg) ;	// 调用Exception类中有一个参数的构造方法,传递错误信息
	}
};
public class DefaultException{	
	public static void main(String args[]){
		try{
			throw new MyException("自定义异常。") ;	 // 抛出异常
		}catch(Exception e){
			System.out.println(e) ;
		}
	}
}

常见的几种RuntimeException如下:

NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常

NoClassDefFoundError错误发生的原因

NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。很多Java开发者很容易在这里把这两个错误搞混。

简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。

NoClassDefFoundError和ClassNotFoundException区别

我们经常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError这两个错误迷惑不清,尽管他们都与Java classpath有关,但是他们完全不同。NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。

猜你喜欢

转载自blog.csdn.net/nc0000/article/details/80371534
今日推荐