我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中的异常与错误如何处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中的异常与错误如何处理

这篇文章主要介绍“Java中的异常与错误如何处理”,在日常操作中,相信很多人在Java中的异常与错误如何处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常与错误如何处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

异常与错误:

异常:

在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它。Java中使用异常类来表示异常,不同的异常类代表了不同的异常。但是在Java中所有的异常都有一个基类,叫做Exception。

错误:

它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。错误是VM的一个故障(虽然它可以是任何系统级的服务)。所以,错误是很难处理的,一般的开发人员(当然不是你)是无法处理这些错误的,比如内存溢出。  和异常一样,在Java中用错误类来表示错误,不同的错误类代表了不同的错误。 但是在Java中所有的错误都有一个基类,叫做Error。

综上,我们可以知道异常和错误最本质的区别就是异常能被开发人员处理而错误时系统本来自带的,一般无法处理也不需要我们程序员来处理。

一个异常是在一个程序执行过程中出现的一个事件,它中断了正常指令的运行

错误,偏离了可接受的代码行为的一个动作或实例

异常的结构分类:

运行时异常(未检查异常)

编译时异常(已检查异常)

运行异常即是RuntimeException;其余的全部为编译异常

在Java中异常Exception和错误Error有个共同的父类Throwable。

Error Exception

runtimeException几个子类

java.lang.ArrayIndexOutOfBoundsException

数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

java.lang.ArithmeticException

算术条件异常。譬如:整数除零等。

java.lang.NullPointerException

空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的

属性、计算null对象的长度、使用throw语句抛出null等等

java.lang.ClassNotFoundException

找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出

该异常。

对异常的处理:

try{}catch{}

try{}catch{}finally{}无论有无异常finally代码块都会被执行

try{}finally{}也是可以组合使用的但是catch{}finally{}不可以

注意:在继承关系中,子类覆盖父类的方法,抛出异常的范围不能比父类更宽泛

异常的使用

在异常的使用这一部分主要是演示代码,都是我们平常写代码的过程中会遇到的(当然只是一小部分),抛砖引玉吗!

例1. 这个例子主要通过两个方法对比来演示一下有了异常以后代码的执行流程。

public static void testException1() {      int[] ints = new int[] { 1, 2, 3, 4 };      System.out.println("异常出现前");      try {           System.out.println(ints[4]);           System.out.println("我还有幸执行到吗");// 发生异常以后,后面的代码不能被执行      } catch (IndexOutOfBoundsException e) {           System.out.println("数组越界错误");      }      System.out.println("异常出现后"); }    public static void testException2() {      int[] ints = new int[] { 1, 2, 3, 4 };      System.out.println("异常出现前");      System.out.println(ints[4]);      System.out.println("我还有幸执行到吗");// 发生异常以后,他后面的代码不能被执行 }

首先指出例子中的不足之处,IndexOutofBoundsException是一个非受检异常,所以不用try…catch…显示捕捉,但是我的目的是对同一个异常用不同的处理方式,看它会有什么不同的而结果(这里也就只能用它将就一下了)。异常出现时***个方法只是跳出了try块,但是它后面的代码会照样执行的。但是第二种就不一样了直接跳出了方法,比较强硬。从***个方法中我们看到,try…catch…是一种”事务性”的保障,它的目的是保证程序在异常的情况下运行完毕,同时它还会告知程序员程序中出错的详细信息(这种详细信息有时要依赖于程序员设计)。

例2. 重新抛出异常

public class Rethrow {      public static void readFile(String file) throws FileNotFoundException {      try {           BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));      } catch (FileNotFoundException e) {           e.printStackTrace();           System.err.println("不知道如何处理该异常或者根本不想处理它,但是不做处理又不合适,这是重新抛出异常交给上一级处理");           //重新抛出异常           throw e;      } } public static void printFile(String file) {      try {           readFile(file);      } catch (FileNotFoundException e) {           e.printStackTrace();      } }      public static void main(String[] args) {           printFile("D:/file");      } }

异常的本意是好的,让我们试图修复程序,但是现实中我们修复的几率很小,我们很多时候就是用它来记录出错的信息。如果你厌倦了不停的处理异常,重新抛出异常对你来说可能是一个很好的解脱。原封不动的把这个异常抛给上一级,抛给调用这个方法的人,让他来费脑筋吧。这样看来,java异常(当然指的是受检异常)又给我们平添很多麻烦,尽管它的出发点是好的。

例3. 异常链的使用及异常丢失

ExceptionA,ExceptionB,ExceptionC public class ExceptionA extends Exception {      public ExceptionA(String str) {           super();      } } public class ExceptionB extends ExceptionA {      public ExceptionB(String str) {           super(str);      } } public class ExceptionC extends ExceptionA {      public ExceptionC(String str) {           super(str);      } }

异常丢失的情况:

public class NeverCaught {      static void f() throws ExceptionB{           throw new ExceptionB("exception b");      }      static void g() throws ExceptionC {           try {                f();           } catch (ExceptionB e) {                ExceptionC c = new ExceptionC("exception a");                throw c;           }      }      public static void main(String[] args) {           try {                g();           } catch (ExceptionC e) {                e.printStackTrace();           }      } } 

为什么只是打印出来了ExceptionC而没有打印出ExceptionB呢?这个还是自己分析一下吧!

上面的情况相当于少了一种异常,这在我们排错的过程中非常的不利。那我们遇到上面的情况应该怎么办呢?这就是异常链的用武之地:保存异常信息,在抛出另外一个异常的同时不丢失原来的异常。

public class NeverCaught {      static void f() throws ExceptionB{            throw new ExceptionB("exception b");      }      static void g() throws ExceptionC {           try {                 f();           } catch (ExceptionB e) {                 ExceptionC c = new ExceptionC("exception a");                 //异常连                 c.initCause(e);                 throw c;           }      }      public static void main(String[] args) {           try {                 g();           } catch (ExceptionC e) {                 e.printStackTrace();           }      } } 

这个异常链的特性是所有异常均具备的,因为这个initCause()方法是从Throwable继承的。

例4. 清理工作

清理工作对于我们来说是必不可少的,因为如果一些消耗资源的操作,比如IO,JDBC。如果我们用完以后没有及时正确的关闭,那后果会很严重,这意味着内存泄露。异常的出现要求我们必须设计一种机制不论什么情况下,资源都能及时正确的清理。这就是finally。

public void readFile(String file) {      BufferedReader reader = null;      try {            reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));            // do some other work      } catch (FileNotFoundException e) {            e.printStackTrace();      } finally {            try {                  reader.close();            } catch (IOException e) {                  e.printStackTrace();            }      } }

例子非常的简单,是一个读取文件的例子。这样的例子在JDBC操作中也非常的常见。(所以,我觉得对于资源的及时正确清理是一个程序员的基本素质之一。)

Try…finally结构也是保证资源正确关闭的一个手段。如果你不清楚代码执行过程中会发生什么异常情况会导致资源不能得到清理,那么你就用try对这段”可疑”代码进行包装,然后在finally中进行资源的清理。举一个例子:

public void readFile() {      BufferedReader reader = null;      try {            reader = new BufferedReader(new InputStreamReader(new FileInputStream("file")));            // do some other work            //close reader            reader.close();      } catch (FileNotFoundException e) {            e.printStackTrace();      } catch (IOException e) {            e.printStackTrace();      } }

我们注意一下这个方法和上一个方法的区别,下一个人可能习惯更好一点,及早的关闭reader。但是往往事与愿违,因为在reader.close()以前异常随时可能发生,这样的代码结构不能预防任何异常的出现。因为程序会在异常出现的地方跳出,后面的代码不能执行(这在上面应经用实例证明过)。这时我们就可以用try…finally来改造:

public void readFile() {      BufferedReader reader = null;      try {            try {                  reader = new BufferedReader(new InputStreamReader(new FileInputStream("file")));                  // do some other work                  // close reader            } finally {                  reader.close();            }       } catch (FileNotFoundException e) {            e.printStackTrace();       } catch (IOException e) {            e.printStackTrace();       } }

及早的关闭资源是一种良好的行为,因为时间越长你忘记关闭的可能性越大。这样在配合上try…finally就保证万无一失了(不要嫌麻烦,java就是这么中规中矩)。

再说一种情况,假如我想在构造方法中打开一个文件或者创建一个JDBC连接,因为我们要在其他的方法中使用这个资源,所以不能在构造方法中及早的将这个资源关闭。那我们是不是就没辙了呢?答案是否定的。看一下下面的例子:

public class ResourceInConstructor {      BufferedReader reader = null;      public ResourceInConstructor() {           try {                 reader = new BufferedReader(new InputStreamReader(new FileInputStream("")));           } catch (FileNotFoundException e) {                 e.printStackTrace();           }      }      public void readFile() {           try {                  while(reader.readLine()!=null) {                       //do some work                  }           } catch (IOException e) {                  e.printStackTrace();           }       }       public void dispose() {            try {                 reader.close();            } catch (IOException e) {                 e.printStackTrace();            }       } }

到此,关于“Java中的异常与错误如何处理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中的异常与错误如何处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中的异常与错误如何处理

这篇文章主要介绍“Java中的异常与错误如何处理”,在日常操作中,相信很多人在Java中的异常与错误如何处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常与错误如何处理”的疑惑有所帮助!接下来
2023-06-17

深入探讨JAVA中的异常与错误处理

这篇文章详细介绍了JAVA中的异常与错误处理,有需要的朋友可以参考一下
2022-11-15

java中异常与错误

在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),
java中异常与错误
2014-07-04

Vue中如何优雅地处理错误与异常?

Vue提供了完善的错误处理机制:全局错误处理、模板错误边界、异步错误处理、Promise错误处理和异常处理对象。开发者可以通过这些机制优雅地处理错误和异常,实现错误日志记录、告警、错误恢复等操作。最佳实践包括:使用全局错误处理程序、针对特定区域使用组件、在异步操作中使用try/catch或await处理错误、根据错误类型使用自定义异常处理对象、记录所有错误并提供清晰的错误消息。
Vue中如何优雅地处理错误与异常?
2024-04-02

MariaDB中如何处理异常和错误

在MariaDB中,异常和错误一般通过以下方式处理:使用存储过程和函数:可以在存储过程和函数中使用异常处理语句来捕获和处理异常和错误。MariaDB支持类似于try-catch的语法来处理异常,如使用BEGIN…END块包围代码,并在发生异
MariaDB中如何处理异常和错误
2024-04-09

php7中异常与错误的处理方法

这篇文章将为大家详细讲解有关php7中异常与错误的处理方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。异常与错误的概述什么叫做异常?异常是指程序运行中不符合预期情况以及与正常流程不同的状况。比如你链接数
2023-06-14

Ruby在Linux中处理异常与错误

在Ruby中,异常和错误是通过Exception类来表示的要在Ruby中处理异常,你可以使用begin、rescue、ensure和raise关键字。下面是一个简单的例子:begin# 这里放可能引发异常的代码result = 1 /
Ruby在Linux中处理异常与错误
2024-09-10

php常见的错误与异常处理方法

本篇内容介绍了“php常见的错误与异常处理方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php与其他计算机编程语言在遇到错误就抛出异常不
2023-06-02

golang函数中的错误处理与异常处理的比较

go 语言提供两种错误处理机制:1. 错误处理:使用 err 参数返回错误,调用方需显式处理;2. 异常处理:使用 panic() 和 recover() 函数,引发并捕获异常。实战场景:错误处理常用于文件操作(返回 nil 表示成功,非零
golang函数中的错误处理与异常处理的比较
2024-04-25

请描述PHP中的错误和异常处理机制。(在PHP编程中,如何处理错误和异常?)

PHP提供健壮的错误和异常处理机制,分为错误处理(处理语法错误和运行时问题)和异常处理(处理不可恢复错误和程序逻辑问题)。错误通常输出到标准错误输出流,而异常使用try...catch语句处理。开发者可自定义错误和异常处理机制,遵循最佳实践,如使用try...catch语句、提供详细错误消息,确保应用程序稳定性和可靠性。
请描述PHP中的错误和异常处理机制。(在PHP编程中,如何处理错误和异常?)
2024-04-02

SQLServer中如何处理异常和错误信息

在SQLServer中,可以使用TRY…CATCH块来处理异常和错误信息。TRY…CATCH块用于尝试执行一段代码,并在出现异常或错误时捕获并处理它们。以下是一个示例:BEGIN TRY-- 尝试执行一些可能会出现异常的代码SELECT
SQLServer中如何处理异常和错误信息
2024-04-09

异常处理与传统错误处理在 PHP 中的比较?

异常处理是一种结构化的错误处理机制,将错误打包成对象,提供了更健壮、结构化和可追踪的方式来处理错误,弥补了传统错误处理的局限性。异常处理与传统错误处理在 PHP 中的比较传统错误处理PHP 的传统错误处理方法依赖于函数 error_re
异常处理与传统错误处理在 PHP 中的比较?
2024-05-09

Golang错误处理方式异常与error

我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,这个时候我们如何才能更好的处理异常呢?本文来教你正确方法
2023-01-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录