一、异常概念引入
package TEXT;
public class Demo {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
当我们执行以上java程序的时候,会发现出错了
这个错误是一个非常简单的错误,只是数组索引出界 而这个也是一种异常,一种可以通过修改代码修复的异常 ArrayIndexOutOfBoundsException 通过查询帮助文档 ArrayIndexOutOfBoundsException是继承了异常类Throwable的类 在JAVA面向对象中,异常也是被封装成了一个对象,这个对象继承了Throwable类
那么官方术语异常是什么呢? 异常是指在程序运行中代码产生的一种错误。
二、Throwable类
Throwable类是类库java.lang包中的一个类,它派生出两个子类,Error类和Exception类
Error类代表了JAVA内部的错误或者某些硬件的错误,比如内存溢出错误,栈溢出错误,系统内部错误等等,不能通过修改代码来实现解决该错误, 因此,Error类的错误被认为不能恢复的严重错误 所以,我们在写代码的时候,要尽量避免Error类的错误
而Exception类是用户程序能够捕捉到的异常情况,一般情况下,Exception类通过产生它的子类来创建自己异常,而这个异常可以通过修改代码以达到修复该异常的作用
三、异常处理
1. try…catch…finally
try{ 可能产生异常的代码 } catch(Exception e1){ 对e1异常的处理 } catch(Exception en){ 对en异常的处理 } finally{ 一定会运行的语句序列 }
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("开始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("结束");
}
}
用了这个处理异常之后,当程序遇上异常后,不再像以前那种直接退出程序而是可以继续往下执行,这在我们以后开发软件非常实用,我们开发出来的软件,如果遇到异常后直接退出程序,那么将会给用户不好的体验,因此我们希望的是程序遇到异常可以往下执行,并且把异常报出来。
2. throws
try…catch…可以对异常进行处理,但是不是所有的情况我们都有权限进行异常的处理 也就是说,有些时候可能会出现我们处理不了的,这时候该怎么办呢? 针对这种情况下,JAVA提供了throws的处理方法
格式: throw 异常类名
注意 :这个格式时跟在方法的括号后面的
package TEXT;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo_1 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() throws ArrayIndexOutOfBoundsException{
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
通过这个这个的运行结果可以看出来,并没有执行输出”结束“,因此throws处理异常并不是真正处理异常而是只是把这个异常抛出了,如果想要继续往下执行,那么需要对method继续使用try…catch,所以这仅仅时延迟了异常
3.总结
四、Throwable的成员方法
1、getMessage——用于输出异常的原因
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("开始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
System.out.println(e.getMessage());
}
System.out.println("结束");
}
}
2、toString——用于输出异常的类名以及异常原因
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("开始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
System.out.println(e.toString());
}
System.out.println("结束");
}
}
3、printStackTrace——把异常信息输出
package TEXT;
public class Demo {
public static void main(String[] args) {
System.out.println("开始");
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("结束");
}
}
五、编译异常与运行异常
JAVA中的异常被分为两大类:编译异常和运行异常,也被称为受检异常和非受检异常 所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常
- 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
- 运行时异常:无需显示处理,也可以和编译时异常一样处理
package TEXT;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo_1 {
public static void main(String[] args) {
method();
method2();
}
public static void method(){
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}catch (Exception e){
e.printStackTrace();
}
}
public static void method2(){
try {
String s = "2020-09-01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}catch (ParseException e){
e.printStackTrace();
}
}
}
六、自定义异常
在我们编写程序的时候,会遇到各种各样的异常,但是,并不是所有的异常都是JAVA实现封装成对象的,因此自定义异常的作用就出来了,在自定义异常类中通过编写新的方法来处理相关异常
那么我们怎么创建属于自己的异常呢? 我们只需要在建立异常的时候,继承Exception或者RuntimeException即可
package TEXT_1;
public class ScoreException extends Exception{
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}
package TEXT_1;
public class Teacher {
public void checkScore(int score) throws ScoreException{
if (score < 0 || score > 100){
throw new ScoreException("你给的分数有误,应该给0~100!!!");
}else {
System.out.println("分数正常");
}
}
}
package TEXT_1;
import java.util.Scanner;
public class TeacherTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
int score = sc.nextInt();
Teacher t = new Teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}
七、throws和throw的区别
注意:抛出异常,不一定会有异常,当出现异常才会有异常
|