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