Java异常入门

 

目录

前言

异常

什么是异常

异常(Exception)和错误(Error)

异常的处理

异常的作用


前言

我们用一个简单情形引入异常:

class Devide{public int divide(int a ,int b ){return a / b ;}
}public class Main{public static void main(String[] args){Devide divide = new Devide();divide.divide(1 ,0) ;}
}

我们假设有这样一段代码,显然,这段代码是有错误的,因为我们使得除数为0,假使运行,我们将得到以下结果:

可以看到,编译器给我们报了 ArithmeticException(算数异常),中断了程序,并告诉我们是由除0引起的,这就是一个最简单的异常。

异常

什么是异常

Java 异常是在程序执行过程中发生的意外情况,它们可以中断正常的程序流程,并提供了一种机制来处理这些意外情况。异常通常分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)

  1. 受检异常(Checked Exception)

    • 受检异常是指在编译时被检查的异常,即在代码中必须显式地捕获或声明抛出以避免编译错误。
    • 典型的受检异常包括 I/O 异常(如文件不存在或读写失败)、SQL 异常(如数据库连接错误或查询错误)等。
    • 受检异常通常是可以恢复的,并且程序应该有相应的处理机制来解决这些异常。
  2. 非受检异常(Unchecked Exception)

    • 非受检异常是指在运行时发生的异常,不需要在代码中显式地捕获或声明抛出。
    • 典型的非受检异常包括空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)等。
    • 非受检异常通常是由编程错误引起的,比如访问 null 对象的属性或方法、数组访问越界等。

在 Java 中,所有异常都是 Throwable 类的子类。Throwable 类有两个主要的子类:Exception 和 Error。

异常(Exception)和错误(Error)

  • Exception:Exception 是程序正常运行中可以预料到的意外情况所引发的异常的超类。它又分为受检异常和非受检异常两种。

  • Error:Error 是指程序无法处理的系统错误或资源耗尽等严重问题所引发的异常。与一般的异常不同,Error 通常发生在 JVM 或底层系统中,无法通过代码来解决。

简要的理解,异常往往指的是得到的结果和预期不一致,会中断程序的运行,但其实不代表程序就不能够向下运行了。而错误一旦发生,程序就连运行都做不到了。

异常的处理

Java 提供了一套异常处理机制,通过 try-catch-finally 语句来捕获和处理异常。一个典型的异常处理代码结构如下:

try {// 可能会抛出异常的代码// 比如可能发生除以零的操作、访问 null 对象等
} catch (ExceptionType1 e1) {// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {// 处理 ExceptionType2 类型的异常
} finally {// 无论是否发生异常,都会执行的代码块// 通常用来释放资源等清理工作
}

在 try 代码块中,放置可能会引发异常的代码;catch 代码块用来捕获和处理特定类型的异常;finally 代码块中的代码无论是否发生异常都会被执行,通常用来进行资源的释放或清理工作。

除了 try-catch-finally 语句外,还可以使用 throws 关键字来声明方法可能抛出的异常,从而将异常的处理责任交给调用者。

异常的作用

异常机制的最重要作用就是“保护”,我们说,出现异常并不是说程序就完全不能运行了,而是得不到预期的结果。但Java的工程师们为什么要在异常发生时强行中断程序呢?试想刚刚的例子,一个数除以0交给系统去运算,不清楚到底会得到一个什么样的值,如果这时不中断程序,而是继续运行,那之后要是用到了这个值呢?后果是不堪设想的,所以Java的异常机制就是在保护我们程序的健壮性。

本篇博文到此就结束了,新手上路,水平有限,如有错误,还望海涵并指出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/594076.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

myql join连接 全部

学习了mysql 连接查询和子查询,把连接查询的所有情况,做一个介绍。 1,数据: 部门数据: DROP TABLE IF EXISTS department; CREATE TABLE department (id int(11) NOT NULL AUTO_INCREMENT,deptName varchar(30) DEFAU…

【资源分享】-免费-的论文查重软件-论文照妖镜下载-使用教程

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

Python输出不了中文怎么解决

在文件头加上#encoding:utf-8即可。 # encoding: utf-8 print helloworld print u"学习" print (unicode("学习", encoding"utf-8")) shell输出: helloworld 学习 学习 还可以用#-*- coding: UTF-8 -*- 来指定。

C++--对象作为返回值-----拷贝构造函数不执行的问题解决方案

1.问题现象 本来func函数返回p1,实际上p1会先拷贝一份传递给test函数里面的p,这个时候会执行拷贝构造函数,但是实际上的输出并没有; 而且执行拷贝构造函数的时候,因为生成p1的副本,所以我们打印的地址应该不相同&…

数码管与译码器

目录 数码管 显示的基本原理 LED数码管的显示方式 静态显示方式 动态显示方式 具体案例 数码管静态显示 电路图 keil文件 数码管动态显示 电路图 keil文件 74LS138译码器 简介 译码表 译码器案例 电路图 keil文件 74HC595译码器 前言 举例解释 简单案例 …

可变参数模板

可变参数模板的概念 可变参数模板是C11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板。 在C98/03中,类模板和函数模板中只能包含固定数量的模板参数,可变模板参数无疑是一个巨大的…

我与C++的爱恋:类与对象(一)

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象&…

EfficientVMamba实战:使用 EfficientVMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

java中大型医院HIS系统源码 Angular+Nginx+SpringBoot云HIS运维平台源码

java中大型医院HIS系统源码 AngularNginxSpringBoot云HIS运维平台源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务,提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工…

虚良SEO-蜘蛛池的作用与工作原理

蜘蛛池是一种SEO优化工具,其主要作用是吸引搜索引擎蜘蛛到特定网站进行爬行和索引,从而提高网站的可见性和排名。下面分别介绍蜘蛛池的作用和工作原理。 蜘蛛池的作用: 提高网站收录: 当一个网站新发布时,或者长时间…

Thread的基本用法

目录 正文: 1.线程创建 2.线程休眠 3.获取线程实例 4.线程中断 5.线程等待join() 总结: 正文: 1.线程创建 线程创建是多线程编程的第一步,它涉及到创建一个可以并行执行的新线程。在Java中,有几种不同的方法可…

c++的学习之路:11、string(3)

昨天写string的时候没有说全,这里就开始接着讲。 目录 一、resize 二、insert 三、erase 一、resize 昨天说这个的时候没有考虑到缩小范围时咋处理,然后发现报错了,接着我调试发现缩小就不能正常执行了,因为用的是strcap所以…