Java中的异常
1.为什么要使用异常
什么是异常机制 ?
一般来说,高级一点的编程语言,如Java, Php,javascript, c#它们都具备一套用来处理, 在程序的运作过程中监视与捕
获突发的各种异常的机制,可允许在相应的代码当中编写相应的补救措施/处理办法。
Java中为了增强程序的健壮性,保证程序遇到问题还能继续运行.
2.异常的概念
什么是异常: 在程序中出现了不正常情况就叫做异常
常见异常的体系结构:
3.JVM默认处理异常的方式
如果程序中出现了不正常情况,且我们没有主动的去处理,这时候JVM会默认处理这个异常,打印出异常后,终止程序.
public class TryCatchDemo {
public static void main(String[] args) throws ParseException {
Scanner in = new Scanner(System.in);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("请输入日期:");
String str = in.next();
// 使用parse方法,将字符串转换为日期
// 如果出现异常,交给JVM默认处理
Date date3 = df.parse(str);
System.out.println("后续代码");
System.out.println("日期为:" + date3);
}
}
4.处理异常的方式
try–catch处理异常 throws抛出异常
注意:
异常机制的体系结构
当程序出现异常,但没有处理,会抛出异常,程序不会再往下执行
可以使用trycatch进行异常的捕抓和处理 【多捕获、针对异常类型进行捕获】
异常处理【trycatch 将异常往上抛出】
注意:try中的代码块出现异常后,则try剩余的语句不会再执行
如果trycatch中出现异常类型并不是catch所指定的类型则会直接抛出异常
try–catch处理异常
try—catch处理异常: 将可能出现不正常情况的代码放在try模块中,当出现异常时,直接匹配catch中设定的异常捕获类,
注意: 为了避免出现捕获不了异常,最后一个异常使用Exception异常父类捕获,或直接使用Exception捕获
格式: try{
可能出现异常的代码;
出现异常后,后续代码不会执行
}catch(异常类 类名){
捕获到异常后,处理异常
}catch(异常类1 类名1){
捕获到异常后,处理异常
}
.......
finally{
不管是否出现异常,都会执行,一般 用于关闭资源
}
try–catch简单处理
public class TryCatchDemo {
public static void main(String[] args) throws ParseException {
Scanner in = new Scanner(System.in);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("请输入日期:");
String str = in.next();
// 使用parse方法,将字符串转换为日期
Date date3=null;
try {
//可能出现异常的代码
date3 = df.parse(str);
System.out.println("try后续代码");
} catch (ArrayIndexOutOfBoundsException e) {
//异常会进行匹配,如果匹配不上是不会处理异常的
e.printStackTrace();
}
System.out.println("后续代码");
System.out.println("日期为:" + date3);
}
}
多重try—catch处理异常: 如果第一个catch中的异常类没有匹配上,会继续匹配第二个异常类,如果都没匹配上会被JVM捕获
注意: 小范围的异常类放在前面的catch中,返回大的异常类放在后面的catch中
finally 不管是否发生异常,都被执行
public class TryCatchDemo1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入除数:");
int num = in.nextInt();
int result = 0;
try {
//可能出现异常的代码
result = 20/num;
System.out.println("try后续代码");
} catch (ArrayIndexOutOfBoundsException e) {
//异常会进行匹配,如果匹配不上是不会处理异常的
e.printStackTrace(); //打印栈异常信息
} catch(ArithmeticException e) {
System.out.println("除数不能为0");
} catch(Exception e) { //注意:多重异常捕获,将小范围的异常类放在前面
System.out.println("被父类异常捕获");
}finally {
//不管是否异常都会关闭资源
in.close();
}
System.out.println("后续代码");
System.out.println("运算结果为:" + result);
}
}
5.throws抛出异常类型
throws一般用于方法中,在方法内部出现异常后,但该方法没有处理异常,则使用throws抛出异常,谁调用该方法谁处理异常.
格式: 在方法名的后面 使用throws关键 抛出 异常类型
public void 方法名() throws 异常类{
可能出现异常方法体;
}
public class ThrowsDemo {
public static void main(String[] args) {
int result=0;
//提示需要处理方法抛出的异常
try {
result = show();
} catch (Exception e) {
//获取异常信息
System.out.println(e.getMessage());
}
System.out.println("运算结果为:"+result);
}
//方法需要抛出异常,用于调用方法者处理可能出现的异常
private static int show() throws Exception {
Scanner in = new Scanner(System.in);
System.out.println("请输入除数:");
int num = in.nextInt();
int result = 20/num;
return result;
}
}
6.throw手动抛出异常对象
主动定义一个异常对象,并使用throw抛出异常对象,方法需要抛出异常,使用throws
public class ThrowDemo {
public static void main(String[] args) {
try {
show();
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
//throws在这里的作用使用,让我们throw抛出的异常对象从方法之中抛出
private static void show() throws Exception {
int score = -5;
if(score<=100&& score>=0) {
System.out.println("成绩正常!");
}else {
//使用throw手动抛出异常对象,并设置异常信息
throw new Exception("您的成绩不在范围之中!");
}
}
}
try–catch与throws应用场景
try-catch一般用于集中处理异常,或快速异常处理
throws多用与较少调用或能被集中处理异常的方法使用
finally语句块
finally和trycatch一起使用的
不管trycatch中是否有出现异常都会执行finally中的代码
不管trycatch中是否有出现异常return语句都会执行
finally会影响方法的返回值、finally中如果有return语句,则trycatch中的
return就不起作用,最终还是返回finally中的数据