异常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("录入错误,您录入的是非法字符,请重新输入一个整数:"); } } } } } }