异常Throwable的概述以及子类Exception的说明

异常Throwable

异常Throwable是整个java异常体系中的总根
下面 分为 两大类 一个是 Error 一个是Exception
其中Error是错误 如服务器崩溃 数据库崩溃等 与代码关联不大
Excpetion中又分为两大类 一个是RuntimeException 另一个则是 非RuntimeException
其中RuntimeException指的则是平常程序员敲代码所犯的错误 造成运行时异常
而非RuntimeException 为编译时异常
JVM处理异常的方法
打印错误信息

Throwable 常用方法
1.getMessage()
2.toSting()
3.printStackTrace()

public class Demo5_Throwable {

	/**
	 * * A:Throwable的几个常见方法
			* a:getMessage()
				* 获取异常信息,返回字符串。
			* b:toString()
				* 获取异常类名和异常信息,返回字符串。
			* c:printStackTrace()
				* 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
		* B:案例演示
			* Throwable的几个常见方法的基本使用
	 */
	public static void main(String[] args) {
		try {
			System.out.println(1/0);
		} catch (Exception e) {			//Exception e = new ArithmeticException("/ by zero");
			//System.out.println(e.getMessage());		//获取异常信息
			//System.out.println(e); 		//调用toString方法,打印异常类名和异常信息
			e.printStackTrace();		//jvm默认就用这种方式处理异常
		}
	}

}

处理异常方法1
try{} catch{Exception}
try catch finally

这种处理异常的方法不会终止程序

注意点:捕获的异常中 父类异常要向后放 不然如果父类异常为Exception RuntimeException时 后面子类异常的捕获将毫无意义

处理异常方法2
throw 一个异常对象(类的具体实例)
同时在方法上 throws 一个异常类

这种处理异常的方法会终止程序

throws 和 throw 的区别
注意点 :当抛出的对象为RuntimeException 也就是说抛出的异常对象为运行时异常时,此时就算不在方法上写 throws 异常类,编译也不会报错

finally
除了Sytstem.exit(0);以外 ,任何语句都无法跳过finally中的语句!
其功能是为了关闭各种IO流 或者 数据库

面试题
主要解释一下面试题2吧

public class Test1 {

	/**
	 * * A:面试题1
			* final,finally和finalize的区别
			* final可以修饰类,不能被继承
			* 修饰方法,不能被重写
			* 修饰变量,只能赋值一次
			* 
			* finally是try语句中的一个语句体,不能单独使用,用来释放资源
			* 
			* finalize是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
		* B:面试题2
			* 如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
	 */
	public static void main(String[] args) {
		Demo d = new Demo();
		System.out.println(d.method());
	}

}

class Demo {
	public int method() {
		int x = 10;
		try {
			x = 20;
			System.out.println(1/0);
			return x;
		} catch (Exception e) {
			x = 30;							//此时x为30已经包装好给return 接着去看finally了										
			return x;						//当finally结束后 按照原来的包装路径返回 所以返回值为30
		} finally {
			x = 40;
			//return x;					千万不要在finally里面写返回语句,因为finally的作用是为了释放资源,是肯定会执行的
										//如果在这里面写返回语句,那么try和catch的结果都会被改变,所以这么写就是犯罪					//同时要注意finally中的赋值语句毫无意义!!finally存在的意义就是为了关闭各种流 以及对数据库的操作
										
		}
	}
}

自定义异常
自定义异常有何意义:只是为了区分异常的名字而已 功能都是由总根父类Throwable来提供

异常小练习

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class Test2 {

	/**
	 * 键盘录入一个int类型的整数,对其求二进制表现形式
	 * 如果录入的整数过大,给予提示,录入的整数过大请重新录入一个整数BigInteger
	 * 如果录入的是小数,给予提示,录入的是小数,请重新录入一个整数
	 * 如果录入的是其他字符,给予提示,录入的是非法字符,请重新录入一个整数
	 * 
	 * 分析:
	 * 1,创建键盘录入对象
	 * 2,将键盘录入的结果存储在String类型的字符串中,存储int类型中如果有不符合条件的直接报错,无法进行后续判断
	 * 3,键盘录入的结果转换成int类型的数据,是正确的还是错误的
	 * 4,正确的直接转换
	 * 5,错误的要进行对应判断
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个整数:");
		
		
		while(true) {
			String line = sc.nextLine();					//将键盘录入的结果存储在line中
			try {
				int num = Integer.parseInt(line);				//将字符串转换为整数
				System.out.println(Integer.toBinaryString(num));//将整数转换为二进制
				break;											//跳出循环
			}catch(Exception e) {
				try {
					new BigInteger(line);
					System.out.println("录入错误,您录入的是一个过大整数,请重新输入一个整数:");
				}catch (Exception e2) {							//alt + shif + z (try catch快捷键)
					try {
						new BigDecimal(line);
						System.out.println("录入错误,您录入的是一个小数,请重新输入一个整数:");
					} catch (Exception e1) {
						System.out.println("录入错误,您录入的是非法字符,请重新输入一个整数:");
					}
				}
				
			}
		}
		
		
	}

}

你可能感兴趣的:(Java)