什么是异常?
最简单的,看一个代码示例:
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
这段代码有什么问题?简单,除数不能为0对吧,我们打印输出:
显而易见,程序出问题了,不能正常执行了,这里出现了一些爆红的信息,这些就是异常提示,这就是Java中提供的异常机制,当你的程序存在问题的情况下,会给你打印输出一些信息,这个就叫做异常信息。
字面意思上去理解,所谓“异常”也就是“不正常”,放在代码程序中就是那些导致不能正确执行的问题,比如上述代码,Java就会给你打印出为啥此段代码不能正确执行,给你输出不正常的信息,这样你就可以根据异常信息去修改代码,从而提高代码的健壮性!
详细聊聊异常
以上我们简单看了下一个具体的异常,下面我们就“何为异常”再直白的探讨一下,异常作为一种代码的处理机制,现在基本上大多数的编程语言都包含有这个异常机制,但是,我门熟知的伟大的C语言是没有异常处理机制的。
大多数的高级语言,比如Java,python,C++这些都包含非常完善的异常处理机制,既然有这个玩意,那自然有它的好处,一般来说吧,拥有异常机制可以是我们的代码:
那啥意思嘞?啥是容错性,啥又是健壮呢?
首先是容错性,这个通俗来讲,就是可承受错误的范围和概率,比如说我们的程序要是没有异常机制的话,那很多错误是无法承受的,可能一旦出现错误,就会导致我们的系统崩溃出大问题,这个带来的后果可能比较严重,但是具有异常机制,就可以帮助我们去处理一些错误,以至于即使出现错误也不会造成这么严重的后果。
那什么又是健壮呢?这个一般就是说我们的代码比较安全,不容易出现bug,基本上把该想到的情况都想到了,代码编写比较严谨,不容易出错,质量好,这个一般就可以说我们的代码比较健壮。
当然,以上只是我粗浅的理解,希望能够帮助大家对异常机制的理解。
那再来说异常,其实就是不好的东西,比如我们的代码有bug,程序出错等等,这些都是有可能发生的,谁也不能保证自己写的代码一定是正确的,对吧。
异常也就是代码中可能出现的意外情况,这就要求我们在编写代码的时候尽量考虑全面,但是即使你考虑的再全面也不可能将所有的意外情况都考虑进去,所以,实际当中意外情况会有发生的概率,对于这种我们无法考虑周到的意外情况,就需要我们的异常机制去处理了。
Java中的异常
接下来我们来看看Java中的异常,想必大家多多少少都会听说过这样一个异常叫做空指针异常,我们来看代码演示:
NullPointerException nullPointerException = new NullPointerException("空指针异常");
System.out.println(nullPointerException);
可以发现,在Java真实存在NullPointerException这个类,而我们可以通过这个类去创建具体的异常对象,比如这里的空指针异常对象,我们打印输出看看:
如此来看,在Java中,异常是以类的形式存在的,而且我们可以通过这些异常类去创建相应的异常对象,那么我们再来看这段代码:
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
这里会出现异常,其实实际上就是在运行到“ System.out.println(a / b);”的时候Jvm虚拟机就会在底层为我们创建出一个异常对象,从而将相关的异常信息打印输出。
所以:
Java中异常是的的确确存在的类
Java的异常处理机制
接下来我们来说说Java的异常机制。我们还是来看上面那个代码,也就是这个:
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
这段代码我们如果运行的话是会出错的,也就是这样:
8af8c2d5ed5625f329afdfee27682.png">
发现没有,当我们使用throws去抛出一个异常时,父类中的方法抛出一个异常,而其子类中重写该父类抛出异常的方法的时候,重写后的方法抛出的异常的范围是不能比父类中方法抛出的异常的范围大的,这句话可能有点绕,但是配合看图应该能明白什么意思。
这其实就是Checked异常所带来的一个限制。
手动抛出异常
以上我们使用throw是来抛出异常其实都是Java自动帮我们去抛出异常对象的,除此之外,我们还可以自己手动的去抛出异常,这里需要使用到的一个关键字叫做throw,注意这里是没有s的,和以上我们说的throws是不一样的。
想一下这里为什么要手动抛出异常呢?因为异常本身就不是确定的,什么意思呢?就是同一件事情,在不同的人看来可能性质就不一样,比如你明天要外出,可是明天突然就下雨了,那么这个下雨对你来说就是一种异常,是你不想要的,但是对于那些尤为某种情况希望明天下雨的来说,这件事情就不是一件异常事件。
对应到我们的程序中,异常也是要根据具体情况来定义的,因此这种异常是系统无法帮我们来判定的,这就需要我们自行去抛出异常。
具体就是使用throw来手动抛出异常,怎么操作的看代码:
try {
//规定第一次输入的值不能大于10,也就是这里的stringA不能大于10
Scanner stringA = new Scanner(System.in);
Scanner stringB = new Scanner(System.in);
int a = Integer.parseInt(stringA.next());
int b = Integer.parseInt(stringB.next());
if (a > 10) {
throw new Exception("输入的第一个数字不能大于10");
} else {
System.out.println(a + b);
}
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("第一次输入请输入一个小于10的数字!");
}
同样的,当你手动的抛出一个异常的时候也是需要对这个异常进行处理的,我们这里使用try/catch来捕获处理该异常,看结果:
这里说一点,就是无论你是手动抛出异常还是系统给我们抛出异常,在java中对异常的处理方式是不变的。也就是说碰到Checked异常,要不使用throws将其抛出,要么使用try/catch语句块捕获处理。
自定义异常
一般来说吧,我们不会去手动抛出异常,当然,这里说的异常指的是系统级别的异常,那除此之外,我们还可以自己自定义异常,代码如下:
class MyException extends Exception {
public MyException(){}
public MyException(String msg) {
super(msg);
}
}
以上我们就自定义了一个异常,自定义异常我们需要注意以下两点:
创建一个无参构造器创建一个带有字符串参数的有参构造器
这里的字符串参数其实就是异常的具体描述信息,比如我们之前这样定义一个异常:
一般的我们要是自定义异常的话最好就是有一个“见名知意”的程度,就是我看到你这个自定义异常类名,大概知道这是一个什么异常。
小结
以上我们就Java中的异常进行了学习,不知道你发现没有,我们对异常的学习其实主要就是在围绕以下五个关键字:
trycatchfinallythrowsthrow
然后还有就是要注意Checked异常和Runtime异常,以上都是关于异常的基本知识,掌握这些,足以应付我们在日常工作学习中异常操作,至于更深层次的学习则需要我们在实际应用的去不断的探索了,关于Java中的异常,我们就先介绍到这里。
到此这篇关于Java异常的文章就介绍到这了,更多相关Java异常内容请搜索社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持社区! |