Java 异常小结

Java 异常的关键字有try catch finally ,throws,throw下面我们来看看这几个关键字的基本用法。
一、用法简介

  1. try catch finally
    1)抓取异常,并处理。
try {
	//try里面放有可能出现错误的语句
			} catch (RuntimeException e) {
	        //当出现RuntimeException类型的异常时的解决办法		
			}catch(Exception e){
			//当出现Exception类型的异常时的解决办法
			}finally{
			//不论在try、catch代码块中是否发生了异常事件,finally块中的语句都会被执行
			}
			

finally可以不用写也就是try{}catch{}

  1. throws
    1)抛出异常,将异常抛给调用者解决。
public void readFile(String file)  throws FileNotFoundException {
		……
		// 读文件的操作可能产生FileNotFoundException类型的异常
		FileInputStream fis = new FileInputStream(file);
		 ..……
     }

3.throw

  1. throw用于自己抛出异常,可以抛出的异常必须是Throwable或其子类的实例!!
public class Person { 
	private int age; 
	public int getAge() {
		return age;
	}

	public void setAge(int age) throws PersonException{
		if (age < 0 || age > 100){
			throw new PersonException("年龄不合法");
		}
		this.age = age;
	}
public class Action {
	
	Verification ver = new Verification();

	public double verification(double money){
		
			try {
				if(money<10){
					throw new MoneyException("钱太少了");	
				}else{
					ver.setMoney(money);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		return money;
	}
	

}

ps(以上代码中的自定义异常类需要自己定义)

二、详细说明

  1. Java异常
    任何程序在运行中都有可能出现异常,例如数组下表越界,除数为零,读写文件不存在等等。
    对于这类错误一般有两种处理办法
    a)遇到错误就停止运行
    b)程序员在编程中考虑到出现异常的可能,并进行错误检测,错误消息提示,以及错误处理。

  2. Java异常出现的种类
    a)Error异常:Java虚拟机内部系统出现错误,或者资源耗尽等严重情况。
    b)Exception异常:程序运行出现错误或一些偶然外在因素导致的一般性问题。
    我们一般只负责解决exception异常。
    在这里插入图片描述从这个树中我们可以看出throwable是所有异常类的父类。我们需要解决的exception类,有两个大类一是IOexception(编译时期异常,检查性异常)ps:常遇到的几个。在这里插入图片描述二是RuntimeException(运行时期异常,非检查性异常)ps:常遇到的几个
    在这里插入图片描述

  3. try catch finally

try{
定义可能出现异常的代码
如果try中已经有出现异常的代码了,则try中剩余的代码不在执行

} catch(NullPointerException e){
	处理可能出现的异常
	注:
	1)catch中捕捉的异常的类型要和try中出现的异常的类型相匹配,catch才能处理
	  
	2)catch中捕捉的异常类型可以有多个,这样try中出现的异常会选择相应的catch进行执行,如果都不匹配,则程序停止运行。
		*如果多个catch中捕捉的异常具有父子类关系,则要求子类异常在上,父类异常在下
   catch(ArrayIndexOutOfBoundsException e){
		System.out.println("处理了数组下标越界异常");
   }catch(NumberFormatException e){
		System.out.println("处理了数组下标越界异常");
   }catch(RuntimeException e){
		System.out.println("出现了运行时异常");
   }finally{
   	//finally:不管程序中是否有异常,finall中的代码一定会被执行到,一般再关闭某些资源时会使用
   }

我们知道一般在遇到return的时候程序会结束运行,那么在catch里有return呢?
public class Practice {
	public static void main(String[] args) {
		int[] a = {1,2,3,4};
		int b =getArry(a);
		System.out.println("~~~~~~~");
		System.out.println("b的值为:"+b);
		
	}
	public static int getArry(int[] a){
		try {
			a[4] = 5;//数组下标越界
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("catch中的return返回a[0],a[0]==1");
			return a[0];
		}finally{
			System.out.println("finall中的enturn返回a[3],a[3]==4");
			return a[3];
		}
	}

}

在这里插入图片描述 结果图告诉我们finally会被执行。并且最终的返回值回事finally里的返回值。
在以下两种情况finally不会被执行
a)System.exit(0); //正常退出JVM
b)System.exit(-1);//强制退出JVM

  1. throws
    1)不管throws抛出的是否为运行时异常,调用者都要对其进行处理

  2. throw
    1)thow语句用在方法体内,表示抛出异常,由方法体内的语句处理,
    2) 不能单独使用,要么和try、catch一起使用,要么和throws一起使用。
    3) throws语句用在方法声明后面,表示这个方法可能会抛出异常,表示的是一种倾向,可能,但不一定实际发生。

其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部说明,在api里都可以查阅。 算术异常类:ArithmeticExecption 指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:NumberFormatException 操作数据库异常:SQLException 输入输出异常:IOException 方法未找到异常:NoSuchMethodException java.lang.AbstractMethodError 抽象方法错误。当应用试图调用抽象方法时抛出。 java.lang.AssertionError 断言错。用来指示一个断言失败的情况。 java.lang.ClassCircularityError 类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常java.lang.ClassFormatError 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 java.lang.Error 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。 java.lang.ExceptionInInitializerError 初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。 java.lang.IllegalAccessError 违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常java.lang.IncompatibleClassChangeError 不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。 java.lang.InstantiationError 实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常. java.lang.InternalError 内部错误。用于指示Java虚拟机发生了内部错误。 java.lang.LinkageError 链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。 java.lang.NoClassDefFoundError 未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 java.lang.NoSuchMethodError 方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。 java.lang.StackOverflowError 堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。 java.lang.ThreadDeath 线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。 java.lang.UnknownError 未知错误。用于指示Java虚拟机发生了未知严重错误的情况。 java.lang.UnsatisfiedLinkError 未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。 java.lang.UnsupportedClassVersionError 不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值