Java异常概念:
一种用于处理程序错误的机制。程序运行出现意外情况时,JVM生成一个Exception对象来通知程序。
Java异常分类:
程序员能够处理的均是Exceotion
一、手动处理(直接try-catch-finally)
//自己处理异常,然后代码继续执行
try {
int a = 10/0;//生成异常对象 new ArithmeticException("/by zero")
}catch (Exception e){ //e接收异常对象Exception e = new ArithmeticException("/by zero")
//System.out.println(e.getMessage());//1.获取异常信息(参数)
// System.out.println(e);//2.获取异常类名和信息
e.printStackTrace();//3.(最实用)获取异常类名和异常信息,及异常出现的位置
}finally {//必然执行的语句
System.out.println("处理完毕");
}
System.out.println("代码运行完毕");
运行结果:
java.lang.ArithmeticException: / by zero
at Main.main(Main.java:26)
处理完毕
最后执行完毕
注意问题:
1、只有在try出现问题的时候才会执行catch重点内容。
2、try中出现异常代码会紧接着创建异常对象跳到catch处理,try中后面代码不再执行
3、catch处理完毕之后,后续代码继续执行。
二、抛出异常(throw)
1.抛出运行时异常(RuntimeException)
class Person{
private int age;
//抛出运行时异常,可以不处理,程序会终止
public void setAge(int age) {
if(age>0 && age<=150){
this.age = age;
}else {
/*//1.直接打印出来
System.out.println("非法年龄输入");*/
//2.手动抛出一个运行时异常,终止程序运行
throw new RuntimeException("年龄非法");
}
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.setAge(-10);//输入非法数据
}
}
运行结果:
Exception in thread "main" java.lang.RuntimeException: 年龄非法
at Person.setAge(Main.java:14)
at Main.main(Main.java:22)
2.抛出编译时异常,要么必须处理,要么继续抛出给上一层
1)连续抛出,直至抛给JVM
class Person {
private int age;
//抛出编译时异常,要么必须处理,要么继续抛出给上一层
public void setAge(int age) throws Exception{//第2次抛出方法调用者(main方法)
if(age>0 && age<=150){
this.age = age;
}else {
//手动抛出一个编译时异常
throw new Exception("年龄非法");//第1次抛出给方法setAge
}
}
}
public class Main {
public static void main(String[] args) throws Exception{//第3次抛出给JVM(JVM会做最终处理)
Person p = new Person();
p.setAge(-10);
}
}
运行结果:
Exception in thread "main" java.lang.Exception: 年龄非法
at Person.setAge(Main.java:12)
at Main.main(Main.java:20)
2)在某一层处理(try-catch-finally)
class Person {
private int age;
//抛出编译时异常,要么必须处理,要么继续抛出给上一层
public void setAge(int age) throws Exception{//第2次抛出方法调用者(main方法)
if(age>0 && age<=150){
this.age = age;
}else {
//手动抛出一个编译时异常
throw new Exception("年龄非法");//第1次抛出给方法setAge
}
}
}
public class Main {
public static void main(String[] args){
Person p = new Person();
//直接捕获并处理异常,不再向上抛出
try {
p.setAge(-10);
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("编译时异常处理完毕");
}
}
}
运行结果:
java.lang.Exception: 年龄非法
at Person.setAge(Main.java:12)
at Main.main(Main.java:22)
编译时异常处理完毕