哈喽~大家好呀,这篇来看看JAVA异常篇。
目录
一、前言
二、Exception 异常
1、Java 的非检查性异常
2、Java 检查性异常类
三、Error 错误
四、捕获异常
五、多重捕获块
六、throws/throw 关键字
七、自定义异常类
八、图书推荐
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你用System.out.println(11 / 0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException 的异常。
Java异常可分为3种:
(1)编译时异常:Java.lang.Exception
(2)运行期异常:Java.lang.RuntimeException
(3)错误:Java.lang.Error
Java.lang.Exception和Java.lang.Error 继承自 Java.lang.Throwable;
Java.lang.RuntimeException 继承自 Java.lang.Exception.
编译时异常: 程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范.....这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。
错误: 一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。
异常名称 | 描述 |
---|---|
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
异常名称 | 描述 |
---|---|
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝访问一个类的时候,抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 |
InterruptedException | 一个线程被另一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
我们来看看常见类的使用
ArithmeticException:算术异常
最常见的就是除以了0的例子,例如 int i = 10 / 0;
ArrayIndexOutOfBoundsException:数组下标越界异常
int a[10];
System.out.println(a[10]);
很明显数组下标明显越界了
ClassCastException:类转换异常
Object o = 10;Integer i = (Integer) o;
NullPointerException:空指针异常
String str = null;
str.length();
NumberFormatException:数字格式化异常
ParseException:解析异常
SimpleDateFormat sdf = new SimpleDateFormat(); sdf.parse("abc");
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
这种错误我们最常见的可能是栈溢出问题。如何实现呢?直接递归
public class Text {
public static void main(String[] args) throws Exception {
test();
}
public static void test() {
test();
}
}
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
public class Text {
public static void main(String[] args) throws Exception {
try {
}catch (){
}finally {
}
}
}
Try 语句包含要执行的程序代码,Catch 语句包含要捕获异常类型的声明,finally 语句包含了这个程序一定会执行的语句,例如,我们后面要将的 JDBC 连完数据库之后要释放资源,就一定要放到 finally 里面去。
例子
public class Text {
public static void main(String[] args) throws Exception {
try {
int i = 10 / 0;
}catch (Exception e){
e.printStackTrace();
}finally {
return;
}
}
}
运行结果
java.lang.ArithmeticException: / by zero at com.itxzw.Secondweek.four.Text.main(Text.java:8)
扩:printStackTrace 的意思是打印出异常,但是它还将显示出更深的调用信息。
一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
看这里是不是有点像 if……else if ?
格式
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
例子
public static void main(String[] args) throws Exception {
try {
int i = 10 / 0;
}catch (IndexOutOfBoundsException e){
e.printStackTrace();
} catch (NullPointerException e){
e.printStackTrace();
}catch (ArithmeticException e){
e.printStackTrace();
}finally {
return;
}
}
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
区别:throws 抛出多个异常,throw 抛出一个异常对象。
throws: 跟在方法声明后面,后面跟的是异常类名 throw: 用在方法体内,后面跟的是异常类对象名
示例
public class className
{
public void deposit(double amount) throws RemoteException
{
throw new RemoteException();
}
}
在日常开发中,有些业务逻辑对应的异常类,但系统并未进行定义,那么这时就需要我们自定义异常类进行实现。
自定义异常类需满足以下条件: 1.自定义一个编译期异常:自定义类并继承于java.lang.Exception。 2.自定义一个运行时期的异常类:自定义类并继承于java.lang.RuntimeException
这里我们以例题的形式来讲解
创建一个异常类要有无参与有参的构造方法,throws 与 throw。
AgeGT150Exception.java
public class AgeGT150Exception extends Exception{
public AgeGT150Exception() {
}
public AgeGT150Exception(String message) {
super(message);
}
}
AgeLT0Exception.java
public class AgeLT0Exception extends Exception {
public AgeLT0Exception() {
}
public AgeLT0Exception(String message) {
super(message);
}
}
Student.java
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int 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) {
this.age = age;
}
public void panDuanA() throws AgeLT0Exception{
if (this.age < 0){
throw new AgeLT0Exception("年龄小于0岁");
}
}
public void panDuanB() throws AgeLT0Exception{
if (this.age > 150){
throw new AgeLT0Exception("年龄大于150岁");
}
}
}
Text.java
public class Text {
public static void main(String[] args) {
Student student = new Student("张三",151);
try {
student.panDuanB();
}catch (Exception e){
e.printStackTrace();
}
}
}
运行结果
很明显了,和系统类报错打印的一样,这里我们的自定义异常就讲完了。
Java28岁了,当打之年,并且还会打很多年。
为即将或正在使用Java的你推荐Java“此生错过必遗憾”系列书单。看看你还缺哪本?请补齐。优惠购书链接就在文中,拿好不谢。
Java核心技术第12版开发基础+高级特性(套装共2册)
“Java四大名著”之一Core Java最新版,一键打包全套2册!建议入门小白和准备升级到Java17的开发者购买。本书根据Java17新特性全面升级!赠送作者亲授视频课+海量代码集。
限时秒杀链接
Java核心技术第11版基础知识+高级特性(套装共2册)
“Java四大名著”之一Core Java次新版,一键打包全套2册!建议实际生产环境仍在使用Java8、Java11开发且暂时没有升级版本打算的开发者购买。本书基于Java9-11编写,赠送作者亲授视频课+海量代码集。
限时秒杀链接
Java编程思想[Thinking in Java]
“Java四大名著”之一,需要有一定编程基础的人才可阅读,即使很多内容还无法理解,但每次读完一定会有所收获。本书单最前面推荐的《Java核心技术》侧重技术,而《Java编程思想》侧重于“思想”,本书为你剖析Java中各个内容的设计理念。这是一本伴随我们技术成长的好书,买一本放在旁边,摸着就有底气。
限时秒杀链接
Effective Java 中文版(原书第3版)
Java之父James Gosling:
“我很希望我10年前就能拥有这本书。有人可能认为我不需要任何Java方面的书籍,但是我需要这本书。”
“Java四大名著”之一,适合已经掌握Java核心技术的程序员,想更加深入地了解Java编程语言的开发者阅读。针对如何编写高效、设计优良的程序提出了最实用、最权威的指导方针,通过90条简短、独立的经验法则,探索新的设计模式和语言习惯用法,帮你更加有效地使用Java编程语言及其基本类库,指引你少走弯路。这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。是Java开发人员案头上的一本不可或缺的参考书。
限时秒杀链接
Java语言程序设计基础篇+进阶篇(原书第12版)(套装共2册)
本套书相较于《Java核心技术》更加的基础,如果你阅读《Java核心技术》有些吃力,建议从本书读起。畅销20余年的“长城书”一键打包全套!被世界各地的大学选作教材,更新至Java9、10和11。本书通过示例讲解问题求解技巧,提供大量的程序清单,每章配有丰富的复习题和编程练习题,帮助读者掌握编程技术并解决实际开发中遇到的问题。
限时秒杀链接
Java并发编程实战
让注重实战的你更快领悟Java并发编程的要领,快速构建大规模并发应用程序。“Java四大名著”之一《Effective Java》的作者Joshua Bloch参与编写。本书是Java并发编程领域的里程碑著作!从并发编程的基本理论入手,逐步介绍了在设计Java并发程序时各种重要的设计原则、设计模式与思维模式。另一本蚂蚁金服方腾飞老师写的《Java并发编程的艺术》也适合一并阅读。
限时秒杀链接
软件架构实践(原书第4版)
让你少走弯路的进阶架构师避坑指南!图书届奥斯卡Jolt大奖双冠王作品!全球10余个国家出版。卡内基梅隆等名校教材,IEEE杂志10佳图书,软件架构图书事实标准。
限时秒杀链接
以上图书当当网全部限时秒杀,满100-50,买的越多,优惠越多!了解更多好书点击
本次送 6本书 ,评论区抽6位小伙伴送书
中奖的小伙伴,从以上7本书籍中任选一本
开奖时间:2023-5-27-19:00
参与方式:1.点赞收藏文章
2.在评论区留言:解放双手,拒绝内卷(留言最多五条)
3.抽奖方式为评论区留言随机抽奖(Java程序随机抽取),会在评论区如期公布中奖者,包邮到家。
获奖名单
几分醉意.
古韵遗风绾如兮
周小末天天开心
计算机魔术师
初阶牛
洁洁!
名单公布时间: 2023-05-27 19:00