iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入探讨JAVA中的异常与错误处理
  • 746
分享到

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

JAVA异常错误处理 2022-11-15 22:11:51 746人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

异常与错误:  异常:  在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让

异常与错误:
  异常:
  在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它。Java中使用异常类来表示异常,不同的异常类代表了不同的异常。但是在Java中所有的异常都有一个基类,叫做Exception。
  错误:
  它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。错误是VM的一个故障(虽然它可以是任何系统级的服务)。所以,错误是很难处理的,一般的开发人员(当然不是你)是无法处理这些错误的,比如内存溢出。 和异常一样,在Java中用错误类来表示错误,不同的错误类代表了不同的错误。 但是在Java中所有的错误都有一个基类,叫做Error。
  综上,我们可以知道异常和错误最本质的区别就是异常能被开发人员处理而错误时系统本来自带的,一般无法处理也不需要我们程序员来处理。
  1.一个异常是在一个程序执行过程中出现的一个事件,它中断了正常指令的运行
  2.错误,偏离了可接受的代码行为的一个动作或实例
  异常的结构分类:
  1、运行时异常(未检查异常)
  2、编译时异常(已检查异常)
  运行异常即是RuntimeException;其余的全部为编译异常
  在Java中异常Exception和错误Error有个共同的父类Throwable。
  Error Exception
  runtimeException几个子类
  1、 java.lang.ArrayIndexOutOfBoundsException
  数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
  2、java.lang.ArithmeticException
  算术条件异常。譬如:整数除零等。
  3、java.lang.NullPointerException
  空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的
  属性、计算null对象的长度、使用throw语句抛出null等等
  4、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中还是有好多的东西需要深挖的

--结束END--

本文标题: 深入探讨JAVA中的异常与错误处理

本文链接: https://www.lsjlt.com/news/172548.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 深入探讨JAVA中的异常与错误处理
    异常与错误:  异常:  在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让...
    99+
    2022-11-15
    JAVA 异常 错误处理
  • 深入探讨Golang错误处理的底层逻辑
    Golang是一门由谷歌开发的开源编程语言,被广泛应用于Web开发、云计算等领域。其中的错误处理机制在语言设计中被特别强调,在编写Go程序时,合理处理错误是至关重要的。本文将从源码角度...
    99+
    2024-02-25
    golang 错误处理 源码解析 go语言 string类
  • 深入探讨Golang开发中的常见错误源码
    深入探讨Golang开发中的常见错误源码 在日常的Golang开发中,我们往往会遇到各种各样的错误。有些错误是由于开发人员的疏忽或者对语言特性理解不够透彻造成的,这些错误往往会造成程序...
    99+
    2024-02-28
    开发 golang 错误源码 golang开发
  • Java中的异常与错误如何处理
    这篇文章主要介绍“Java中的异常与错误如何处理”,在日常操作中,相信很多人在Java中的异常与错误如何处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常与错误如何处理”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • 深入探讨Golang与Go语言的异同
    Golang与Go语言的区别详解 1972年,丹尼斯·里奇和肯·汤普逊在贝尔实验室开发了C语言,自那时起,各种不同的编程语言陆续问世,其中有一门备受关注的编程语言就是Go语言,简称“G...
    99+
    2024-02-26
    golang go语言 区别
  • 深入探讨Golang错误处理方式:优秀实践分享
    Golang是一种备受推崇的编程语言,被广泛应用于大型软件项目和云端服务。在Golang的代码编写过程中,错误处理是一个至关重要的方面。本文将深入探讨Golang错误处理的方式,并分享...
    99+
    2024-03-14
    实践 golang 错误处理 格式化输出 标准库
  • Java异常处理深入理解
    目录图片解析:异常的处理:处理机制一:try-catch-finallyfinally的再说明:处理机制二:throws + 异常类型开发中应该如何选择两种处理方式?如何自定义异常类...
    99+
    2024-04-02
  • 深入探讨Golang中堆栈的差异
    Golang是一门广受欢迎的编程语言,其在并发编程方面拥有独特的设计理念。在Golang中,堆栈(heap和stack)的管理是一项非常重要的任务,对于理解Golang程序的运行机制至...
    99+
    2024-03-13
    golang 堆栈 差异
  • PHP 中错误处理函数的深入探究?
    php 中提供错误处理函数,包括:设置自定义错误处理函数:set_error_handler()脚本执行完成后执行函数:register_shutdown_function()获取最后一...
    99+
    2024-05-09
    php 错误处理
  • Java JSP 异常处理:处理错误和异常
    异常处理在 Java 和 JSP 编程中至关重要,因为它允许应用程序优雅地处理错误和异常情况,从而提高健壮性和用户体验。 JSP 中的异常处理 JSP 提供了三种主要机制来处理异常: page 指令:该指令指定处理某个页面上所有未处理异...
    99+
    2024-03-15
    JSP
  • Golang错误处理计划:常见错误场景与解决方案探讨
    Golang错误处理计划:常见错误场景与解决方案探讨 引言 错误处理是编程中一个重要且常见的问题,良好的错误处理能够提升代码的可靠性和稳定性。在Golang中,错误处理是通过返回err...
    99+
    2024-03-11
    解决方案 golang 错误处理
  • 深入探讨Oracle错误3114的背后原因
    Oracle错误3114是数据库中常见的一个错误,通常会在连接数据库或进行查询时出现。这个错误表示Oracle数据库无法连接到目标实例,可能是由于网络连接问题、实例名称错误、权限问题等...
    99+
    2024-03-08
    错误 oracle 探讨
  • Python错误与异常处理
    1. 从键盘输入一个整数,求 100 除以它的商,并显示输出。要求对从键盘输入的数值进行异常处理。 try:     n=int(input("请输入一个整数:"))     x=1...
    99+
    2024-04-02
  • 探讨Golang中最常见的错误
    Golang是一门人气十分旺盛的编程语言,在网站开发、网络服务、云架构等领域中应用广泛。然而,就像其他任何编程语言一样,使用Golang进行开发时经常会遇到许多问题和错误。在本文中,我们将探讨Golang中最常见的错误,以及如何识别和解决它...
    99+
    2023-05-14
  • 深入探讨Golang中的数据处理方法
    深入探讨Golang中的数据处理方法导言:在当今的信息时代,数据是无处不在的。对于开发者来说,处理数据是日常工作中不可或缺的一部分。而Go语言(Golang)作为一种强大且高效的编程语言,提供了许多灵活且易用的数据处理方法。本文将深入探讨G...
    99+
    2023-12-23
    方法 Golang 数据处理
  • 如何深入探讨、理解Java的CLASSPATH
    这篇文章给大家介绍如何深入探讨、理解Java的CLASSPATH,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。从表面上看,Java的classpath(类路径)很简单,但一直以来它都是一个产生问题和混乱的根源。本文介绍...
    99+
    2023-06-03
  • php7中异常与错误的处理方法
    这篇文章将为大家详细讲解有关php7中异常与错误的处理方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。异常与错误的概述什么叫做异常?异常是指程序运行中不符合预期情况以及与正常流程不同的状况。比如你链接数...
    99+
    2023-06-14
  • 深入浅析java中connection reset 的异常处理
    今天就跟大家聊聊有关深入浅析java中connection reset 的异常处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java中常看见的几个connection rest...
    99+
    2023-05-31
    connection reset java
  • Java异常处理机制深入理解
    目录1.初识异常2.异常的基本用法异常处理流程3.为什么要使用异常?异常应只用于异常的情况4. 异常的种类 4.1 受查异常解决方案:4.2非受查异常5.如何使用异常避免不...
    99+
    2024-04-02
  • 深入探讨JavaScript中的内存管理
    内存管理是编程语言的基本能力,JavaScript 中的内存管理是通过 V8 完成的。V8 的实现遵循 ECMA-262 规范,而规范中没有阐述内存布局以及内存管理相关信息,所以它的原理取决于解释器的实现。唯一肯定的是不管任何编程语言,内存...
    99+
    2023-05-14
    前端 JavaScript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作