NO.1 简单异常演示
public static void main (String[] args) {
//Java异常学习--Exception
/**
* * A:JVM默认是如何处理异常的
* main函数收到这个问题时,有两种处理方式:
* a:自己将该问题处理,然后继续运行
* b:自己没有针对的处理方式,只有交给调用main的jvm来处理
* jvm有一个默认的异常处理机制,就将该异常进行处理.
* 并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行
* B:案例演示
* JVM默认如何处理异常
*/
Demo3 d = new Demo3();
// int x = d.div(10,2);
//这样正常调用是没问题的
int x = d.div(10,0);
//我们让除数为0.就会抛出异常
System.out.println(x);//java.lang.ArithmeticException
//以后我们看错误从后往前看,先来到出错的每一行,最后看运行时异常
}
}
class Demo3 {
public int div(int a, int b) {
return a / b;
}
}
NO.2 异常处理的方式
#第一种
public static void main (String[] args) {
/**
* * A:异常处理的两种方式
* a:try⋯catch⋯finally
* try catch
* try catch finally
* try finally
* b:throws
* B:try...catch处理异常的基本格式
* try⋯catch⋯finally
* C:案例演示
* try...catch的方式处理1个异常
try:用来检测异常的
catch:用来捕获异常的
finally:释放资源
世界上最真情的相依就是你在try我在catch,无论你发神马脾气,我都静静接受,默默处理
当通过trycatch将问题处理了,程序会继续执行
*/
Demo2 d = new Demo2();
try{
int x = d.div(10, 0);
System.out.println(x);
}catch(ArithmeticException a) { //ArithmeticException a = new ArithmeticException();
System.out.println("出错了,除数为零了");
}
//我们经过主动异常处理,就可以继续执行程序了
System.out.println("1111111111111111");
}
}
class Demo2 {
/*
* 除法运算
*/
public int div(int a,int b) { //a = 10,b = 0
return a / b; // 10 / 0 被除数是10,除数是0当除数是0的时候违背了算数运算法则,抛出异常
//new ArithmeticException("/ by zero");
}
}
#第二种
/**
* * A:案例演示
* try...catch的方式处理多个异常
* JDK7以后处理多个异常的方式及注意事项
*
* 安卓,客户端开发,如何处理异常?try{}catch(Exception e){}
* ee,服务端开发,一般都是底层开发,从底层向上抛
*
* try后面如果跟多个catch,那么小的异常放前面,大的异常放后面,根据多态的原理,如果大的放前面,就会将所有的子类对象接收
* 后面的catch就没有意义了
*/
public static void main(String[] args) {
//demo1();
int a = 10;
int b = 0;
int[] arr = {11,22,33,44,55};
//JDK7如何处理多个异常
try {
System.out.println(a / b);
System.out.println(arr[10]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("出错了");
}
}
public static void demo1() {
int a = 10;
int b = 0;
int[] arr = {11,22,33,44,55};
try {
System.out.println(a / b);
System.out.println(arr[10]);
arr = null;
System.out.println(arr[0]);
} catch (ArithmeticException e) {
System.out.println("除数不能为零");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("索引越界了");
} catch (Exception e) { //Exception e = new NullPointerException();
System.out.println("出错了");
}
System.out.println("over");
}
}
NO.3 编译时异常和运行时异常的区别
//Java中的异常分为编译期和运行期异常
//写个编译期异常--编译时异常可以理解为未雨绸缪异常
//编译时异常就是必须对其进行处理,不然编译是不通过的
//这个FileInputStream就是读取文件的,现在在自动编译的时候就报错了。
//因为我们这个文件路径可能是错误的,就读取不到,所以我们做下处理
//运行时异常:就是程序员的代码错误,需要程序员回来修改代码
try {
FileInputStream stre = new FileInputStream("tmac.xxx");
}catch (Exception e){
}
NO.4 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默认就用这种方式处理异常
}
}
}
NO.5 throws抛出异常的处理方式
/**
* * A:throws的方式处理异常
* 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
* 那么就通过throws在方法上标识。
* B:案例演示
* 举例分别演示编译时异常和运行时异常的抛出
* 编译时异常的抛出必须对其进行处理
* 运行时异常的抛出可以处理也可以不处理
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setAge(-17);
System.out.println(p.getAge());
}
}
class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeOutOfBoundsException {
if(age >0 && age <= 150) {
this.age = age;
}else {
//Exception e = new Exception("年龄非法");
//throw e;
throw new AgeOutOfBoundsException("年龄非法");
}
}
}
NO.6 finaly关键字的作用和特点
/**
* * A:finally的特点
* 被finally控制的语句体一定会执行
* 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
* B:finally的作用
* 用于释放资源,在IO流操作和数据库操作中会见到
* C:案例演示
* finally关键字的特点及作用
*return语句相当于是方法的最后一口气,那么在他将死之前会看一看有没有finally帮其完成遗愿,如果有就将finally执行
*后在彻底返回
*/
public static void main(String[] args) {
try {
System.out.println(10/0);
} catch (Exception e) {
System.out.println("除数为零了");
System.exit(0); //退出jvm虚拟机
return;
} finally {
System.out.println("看看我执行了吗");
}
}
NO.7 简单面试题
//面试题
//final,finally和finalize的区别
//final:可以修饰类,不能被继承,修饰方法,不能被重写,修饰变量,只能赋值一次
//finally:是try语句中的一个语句体,不能被单独使用,用来释放资源
//finalize:是一个方法,当垃圾回收器确定存在对该对象的过多引用时,由该对象的垃圾回收器调用此方法
//第二题:
//问:如果catch里面有return语句,finally的代码还会执行吗?如果会,请问是在return前还是return后
//答:是在return先建立返回路径,然后执行finally语句,最后返回
//看这个例子
Test test = new Test();
int num = test.method();
System.out.println(num);
}
}
class Test {
public int method(){
int x = 10;
try{
x = 20;
System.out.println(1/0);
return x;
}catch (Exception e){
x = 30;
return x;
}finally {
x = 40;
System.out.println("finally执行了嘛");
//千万不要在finally里面写返回语句,因为finally的作用是释放资源,是肯定执行的。如果在这里面写了返回语句,那么try和catch的结果都会被改变
}
}
}