当前位置: 代码迷 >> 综合 >> MEC@JavaSE@进阶篇@笔记11@异常全面
  详细解决方案

MEC@JavaSE@进阶篇@笔记11@异常全面

热度:19   发布时间:2024-03-09 09:42:36.0

一、异常

1、异常的概念

异常就是不正常,java中的异常就是程序出现了不正常的结果。

2、异常的分类

ThrowableError(错误):一般是设备问题,比如内存不够用,比如硬盘毁坏了Exception(异常)编译期异常:RuntimeException以外的异常都是编译期异常代码会出现红色波浪线,不解决红线不能点击运行运行期异常:RuntimeException以及他的子类是运行期异常代码不会有错误提示

3、见过的异常

NullPointerException             空指针异常
IndexOutOfBoundsException        索引越界异常
ConcurrentModificationException  并发修改异常
ClassCastException               类型转换异常
?
ParseException                   解析异常

4、如何产生异常

1、为什么要产生异常

在代码的逻辑中如果出现了不应该出现的现象,就可以产生异常,用来通知开发人员代码有问题。

2、产生异常的格式

throw new 异常对象();

3、代码举例

import java.util.Objects;
public class Student {private String name;private int age;
?public Student() {}
?public Student(String name, int age) {//对年龄做判断if(age < 0 || age > 130){//产生异常throw new RuntimeException();}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) {this.age = age;}
?@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
?
public class Test {public static void main(String[] args) {
?//创建学生对象Student s1 = new Student("柳岩",37);System.out.println(s1);
?//创建学生对象Student s2 = new Student("马冬梅",-19);System.out.println(s2);}
}

4、异常的处理

运行期异常一般是可以通过修改代码来解决的,不需要特殊处理。

编译期异常因为有红色波浪线,所以需要使用下面的方式处理。

1、处理方式一:

声明抛出异常throws

1、作用

throws是把方法中的异常抛出去,抛给了方法的调用者,谁要调用这个方法,异常就会出现在谁的方法中。

抛出异常是为了解决编译时异常的红线问题,在执行的时候到底有没有异常出现取决于代码书写是否正确,

如果真的代码出错了,程序就会结束,不会继续执行了。

2、格式

方法定义上 throws 异常类型{    

}

3、代码演示

public class Test01 {//main()方法调用了method()方法,main()方法里面就会报错,所以在main()中也需要处理public static void main(String[] args) throws ParseException{//调用方法method();}
?//method()方法抛出了异常,会抛给调用者public static void method() throws ParseException{//日期格式化//编译期异常会有红色提示,如果不解决就不能执行String s = "2000-09-09";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(s);
?}
}

2、处理方式二:

捕获异常try...catch...

1、作用

解决当前方法中的异常,使用try把有异常的代码包起来,如果代码出现了问题就会自动执行对应的catch解决异常,解决之后程序就会正常继续执行。

2、格式

try{可能产生异常的代码
}catch(捕获的异常类型  e){e代表被捕获到的异常对象如果出现了异常就会执行这里
}

3、代码演示

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
?
public class Test02 {public static void main(String[] args) {
?//调用方法method();System.out.println(3);}
?//method()方法抛出了异常,会抛给调用者public static void method(){
?try {//日期格式化//编译期异常会有红色提示,如果不解决就不能执行String s = "2000-09-09";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(s);System.out.println(1);}catch (ParseException e){System.out.println("异常产生了");System.out.println("catch执行之后就解决了异常");System.out.println(2);}}
}

3、两种处理办法的区别

1、共同点:

都能够解决编译期异常的红线问题

2、不同点:

throws是抛出,把遗产抛给了别人处理

trycatch是捕获,把异常自己解决了

5、异常中的常用方法

这些方法可以在catch中使用,用于显示异常信息,给程序员找错用

方法 说明
getMessage() 获取报错【原因】
toString() 获取报错的【类型】【原因】
printStackTrace() 直接打印报错的【类型】【原因】【位置】

1、代码演示

try {//日期格式化//编译期异常会有红色提示,如果不解决就不能执行String s = "2000/09/09";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(s);System.out.println(1);
}catch (ParseException e){//打印【原因】String s = e.getMessage();System.out.println(s);
?//打印【类型】和【原因】String s2 = e.toString();System.out.println(s2);
?//打印【类型】、【原因】和【位置】//这个方法会直接打印,不需要写输出语句e.printStackTrace();
?
}

2、注意事项

  1. 在方法重写中,子类不能抛出比父类更大或更多的异常。

  2. 异常也是类,异常也是遵循多态原理的。

  3. 在写多个catch的时候,上面的类不能是下面类的父类。

6、finally语句块

1、作用

finally是在try后面的语句块,表示必须要执行的代码。

只要不关闭虚拟机finally的代码就一定会执行。

以后我们有一些关闭资源的代码就需要放在finally中。

2、格式

常规写法:try{
?}catch(){
?}finally{
?}
?
源码中有些地方这样写:try{
?}finally{
?}

3、代码演示

import java.util.Date;
import java.text.SimpleDateFormat;
public class Test04 {public static void main(String[] args) {
?try {//日期格式化//编译期异常会有红色提示,如果不解决就不能执行String s = "2000-09-09";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(s);System.out.println(1);//结束方法return;}catch (Exception e){System.out.println("可以解决所有异常");System.out.println(2);}finally{System.out.println("一定会执行的代码");System.out.println(3);}}
}

7、自定义异常

1、自定义异常的作用

有些时候我们需要用到java中不存在的异常,此时就需要自己定义异常类型。自定义异常就是为了在出现异常的时候方便程序员去找错。

比如在年龄赋值错误的时候,想产生一个年龄越界异常。

2、查看异常源码

public class NullPointerException extends RuntimeException {
?public NullPointerException() {super();}public NullPointerException(String s) {super(s);}
}

查看源码发现异常其实里面就只写了构造方法,只要一个类继承异常类,自己就变成了异常。

3、代码演示

?//异常类-----------------------------------
//年龄越界异常
//继承RuntimeException就变成运行时异常
public class AgeOutOfBoundsException extends RuntimeException {//构造方法public AgeOutOfBoundsException() {}
?public AgeOutOfBoundsException(String message) {super(message);}
}
?
//学生类------------------------------------
import java.util.Objects;
public class Student {private String name;private int age;
?public Student() {}
?public Student(String name, int age) {//对年龄做判断if(age < 0 || age > 130){//产生异常throw new AgeOutOfBoundsException("年龄赋值错误"+ age);}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) {//对年龄做判断if(age < 0 || age > 130){//产生异常throw new AgeOutOfBoundsException("年龄赋值错误"+ age);}
?this.age = age;}
?@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
?
?
//测试类---------------------------------
public class Test {public static void main(String[] args) {
?//创建学生对象Student s1 = new Student("柳岩",37);System.out.println(s1);
?//创建学生对象Student s2 = new Student("马冬梅",-19);System.out.println(s2);}
}

 

  相关解决方案