Java基础 ---Throwable异常类

 

前言:
   相信很多小伙伴在其他语言里都是用过异常处理和抛出过异常比如:VB里抛出异常使用Throw "异常提示"这种方式来抛出异常吗,C#直接声明异常throw new Excption("异常提示信息")。这两种抛出异常的方法,一种是过程化的而另一种是面向对象的思想。但是这两种思想捕获异常的方式是一样的。

Try{

}catch(){

}

基本上都是这个格式,只是在使用的时候细节上会与点小差距。今天介绍java的异常处理,从根上介绍。从Exception的父类开始介绍,还有一个我们不能处理的异常Error这个是错误。错误是程序员不能自己处理的,只能交给jvm虚拟机处理。

目录

Throwable体系

Error

Exception

异常分类

编译期异常

运行时异常

Throwable常用方法

public void printStackTrace() :

解释:

代码:

public String getMessage() :

解释:

代码:

public String toString() :

解释:

代码:

异常处理方法

抛出

捕获

处理方法

try catch

调用者再次抛出


Throwable体系

Error

Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。

Exception

Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好 比感冒、阑尾炎。

异常分类

编译期异常

:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)

运行时异常

runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异 常)

Throwable常用方法

public void printStackTrace() :

解释:

打印异常的详细信息。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

代码:

try {
            Date date= sdf.parse("1998-0428");
        } catch (ParseException e) {
            e.printStackTrace();
        }

public String getMessage() :

解释:

获取发生异常的原因。 提示给用户的时候,就提示错误原因。

代码:

 try {
            Date date= sdf.parse("1998-0428");
        } catch (ParseException e) {
             e.getMessage();
        }

public String toString() :

解释:

获取异常的类型和异常描述信息(不用)。

代码:

  try {
            Date date= sdf.parse("1998-0428");
        } catch (ParseException e) {
            e.toString();
        }

异常处理方法

         在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方 法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的 数据进来。这时需要使用抛出异常的方式来告诉调用者。 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。

那么,抛出一个异常具体如何操作呢?

1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。

2. 需要将这个异常对象告知给调用者。

怎么告知呢?

怎么将这个异常对象传递到调用者处呢?

通过关键字throw 就可以完成。

throw 异常对象。

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

抛出

格式

throw new 异常类名(参数);

例如:

throw new NullPointerException("要访问的arr数组不存在");
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");

示例

public class ThrowDemo {
public static void main(String[] args) {
//创建一个数组
int[] arr = {2,4,52,2};
//根据索引找对应的元素
int index = 4;
int element = getElement(arr, index);
System.out.println(element);
System.out.println("over");
}
/*
* 根据 索引找到数组中对应的元素
*/
public static int getElement(int[] arr,int index){
//判断 索引是否越界
if(index<0 || index>arr.length‐1){
/*
判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
*/
throw new ArrayIndexOutOfBoundsException("哥们,角标越界了~~~");
}
int element = arr[index];
return element;
}
}

捕获

上面是直接把声明的对象抛出,下面演示如何处理抛出的异常。(上面的这种方式不处理异常,程序会直接崩溃。)所以只要抛出异常 调用者必须处理。

处理方法

try catch

public class TryCatchDemo4 {
 public static void main(String[] args) {
    try {
    read("a.txt");
 } catch (FileNotFoundException e) {
//抓取到的是编译期异常 抛出去的是运行期
throw new RuntimeException(e);
} finally {
System.out.println("不管程序怎样,这里都将会被执行。");
}
System.out.println("over");
}
/*
*
* 我们 当前的这个方法中 有异常 有编译期异常
*/
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}

调用者再次抛出

这个是异常不在内部处理,抛出给调用者。(调用者如果是main方法的话还可以再次抛出,这次抛出是直接抛给JVM虚拟机处理)

//判断当前注册账号是否存在
//因为是编译期异常,又想调用者去处理 所以声明该异常
public static boolean checkUsername(String uname) throws LoginException{
for (String name : names) {
if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
throw new RegisterException("亲"+name+"已经被注册了!");
}
}
return true;
}

 

posted @ 2020-12-03 12:41  康世行  阅读(453)  评论(0编辑  收藏  举报