我们在编程过程中,通常需要时刻关注可能遇到的问题,此时可以把问题分为两类:普通问题与异常问题。普通问题:我们可以通过从当前环境中获取到的信息来解决这个问题;而异常问题:在当前环境中获取到的信息并不能解决这个问题,所以我们阻止了程序的执行,跳出当前的环境,将这个异常问题,抛到上一级的环境中去解决。可以看出异常机制存在两种基本模型:终止模型(假设异常非常的关键,程序无法自我修复)和恢复模型(可以通过异常处理程序,调用相应的方法来修复出现的错误),然而我们现在所见到的基本为终止模型。
如果方法内部出现了异常,方法将在抛出异常的过程中终止。我们可以通过try建立监控区,在出现异常时跳转到catch区让方法继续执行。我们在编程过程中,关注的重点常在于异常的名字,所以我们可以定义自己需要的异常,此时只需要继承Exception类即可,例如:
public class LogingException extends Exception{ private static final long serialVersionUID = 1L; private static Logger logger = Logger.getLogger("LoggingException"); public LogingException(){ StringWriter trace = new StringWriter(); printStackTrace(new PrintWriter(trace)); logger.severe(trace.toString()); } }
我们实现在一个异常,同时重载了printStackTrace()方法,增加了一个新的功能,在抛出异常时可以自动记录日志。printStackTrace()方法会打印Throwable和Throwable的调用栈轨迹,我们可以通过getStackTrace()获取printStackTrace()所提供的信息,会返回一个由栈轨迹中的元素所构成的数组,元素0为栈顶元素,为调用序列中的最后一个方法的调用;最后一个元素为栈底元素,为调用序列中的第一个方法的调用。我们也可以在catch中将异常重新抛出,此时printStackTrace()显示的为原来的异常抛出点的调用栈信息,如果想显示重新抛出点的信息,可以先调用fillInStackTrace()方法,但此时原来异常抛出点的调用栈信息会丢失。
如果我们也需要显示原始异常的信息该怎么做呢?Throwable的构造方法中其中一个就是介绍cause对象作为参数,cause表示原始异常,可以将原始异常传递给新的异常。在出现异常时,可以通过这样的异常链追踪到异常的最初位置,这也是为什么我们调试异常时先从最下面开始看起。
如果我们在方法中抛出异常时,Java强制我们礼貌的告诉别人某个方法可能会抛出的异常类型,这样别人在调用这个方法时就可以作相应的处理,这就是异常说明,通过关键字throws来实现,它属于方法声明的一部分。在Java的继承关系中关于异常由以下几个需要注意的点:
①如果父类某个非构造方法抛出了异常,那么子类相应的方法只能抛出基类方法中列出的那些异常或异常派生出的异常。
②对于构造方法则恰恰相反,子类构造方法必须抛出包含父类构造方法所抛出的异常,这是由于子类通常需要调用父类的构造方法进行初始化。
③虽然编译器对异常说明做了强制要求,但是异常说明并不属于方法类型一部分,所以就不要想着能通过抛出不同的异常来重载方法了。
④在catch方法对异常类型进行匹配时,catch中的参数exception会匹配该异常类及其子类,匹配成功后,java会认为异常得到了处理,就不在继续向下查找了,这点和以前所学的switch不同,没有break之类的。这点非常重要,如果你修改程序方法,抛出了跟具体派生异常,别人并不需修改代码也可以捕获该异常。例如:
class Annoyance extends Exception{}; class Sneeze extends Annoyance{}; public class Human { public static void main(String[] args) { try{ throw new Annoyance(); }catch(Sneeze s){ System.out.println("Caught Sneeze"); }catch(Annoyance a){ System.out.println("Caught Annoyance"); } try{ throw new Sneeze(); }catch(Annoyance a){ System.out.println("Caught Annoyance"); } // catch(Sneeze s){ // System.out.println("Caught Sneeze"); // } } }
java中还存在一类比较特殊的异常RuntimeException(常见到的NullPointerException就属于它),这属于运行时异常,编译器不对异常声明进行强制检查。这也能给我带来很多的便利,我们可以不用写try/catch或异常声明,如果出现异常,会自动沿着调用栈向上冒泡。也可以通过前面提到的异常链,使用RuntimeException包装强制检查的异常,然后通过getCause()捕获特定的异常。
相关推荐
JAVA基础--如何通过异常处理错误 JAVA是一种面向对象的编程语言,它提供了强大的异常处理机制,以便更好地处理程序中的错误和异常。在JAVA中,异常是指程序在执行过程中发生的错误或意外情况,例如除数为零、数组...
Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本实验报告“java实验报告4-异常处理”旨在帮助初学者掌握Java中的异常处理机制,以及如何利用log4j进行日志...
Java 基础知识:异常处理 Java 中的异常处理是指在程序执行过程中发生错误或异常情况时,程序可以进行适当的处理,以保证程序的稳定性和可靠性。Java 中的异常处理机制可以分为两大类:已检查异常(Checked ...
Java通过强制性的异常处理机制解决了这一问题,将错误处理规范化,提高了代码的可读性、可维护性和整体质量。 #### 异常处理机制的起源 异常处理的概念源自操作系统领域,早在六十年代就已存在,后来在BASIC语言中...
在这个“JAVA基础教程_异常处理-常见异常的举例”中,我们将深入探讨Java异常处理机制以及一些常见的Java异常类型。 首先,Java异常处理通过五个关键字来实现:try、catch、finally、throw和throws。try块包含可能...
### Java异常处理总结 #### 一、Java异常的基础知识 在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么...
异常处理的好处之一是可以先专注于解决问题,然后在其他地方处理代码中的错误: - 一个`try`子句可能抛出多种不同的异常,这就要求定义多个`catch`子句来捕获不同类型的异常。 - 每个`catch`子句接收并处理一种异常...
异常处理使得程序更加健壮,能够优雅地处理错误,而不是简单地崩溃。本章内容将围绕Java异常处理机制展开,包括理解异常概念、使用try-catch-finally语句、多重catch块、嵌套try-catch块、throw和throws关键字,以及...
Java异常处理是编程中至关重要的一个环节,它允许程序员优雅地处理程序运行过程中可能出现的错误情况,确保程序的稳定性和健壮性。异常处理机制在Java中被设计为一种结构化的方法,使得程序在遇到不可预见的问题时,...
Java 异常处理机制详解 Java 异常处理是指在 Java 程序执行过程中出现非预期的情况,例如数组下标越界、空...通过学习 Java 异常处理机制,可以更好地掌握 Java 编程的基础知识,并在实际开发中更好地处理异常情况。
### Java软件设计基础之异常处理 #### 一、异常处理机制概述 在Java编程中,异常处理是一项重要的机制,用于管理程序运行时可能出现的各种错误。理解异常处理的基本概念和技术对于编写健壮、可靠的代码至关重要。 ...
在Java Web开发中,异常处理是一项至关重要的任务,它确保了程序在遇到错误时能够优雅地处理并提供有用的反馈信息,而不是突然崩溃。本主题将深入探讨Java Web开发中的异常处理方式以及Aspect-Oriented Programming...
JAVA基础第6章异常处理机制练习题 本资源是关于JAVA基础第6章异常处理机制的练习题,涵盖了异常处理机制的基本概念、try-catch-finally语句、throw和throws关键字、自定义异常类等知识点。 1. 异常处理机制的基本...
在这个“375.373.JAVA基础教程_异常处理-处理异常:try-catch方式(375)”的教程中,我们将深入探讨Java中的异常处理机制,特别是如何通过try-catch语句块来处理异常。 异常在Java中是一种对象,它是类`Exception`或...
Java的异常处理与IO流是Java编程中两个重要的概念,它们在软件开发中扮演着至关重要的角色。本文将深入探讨这两个主题,以便更好地理解和应用它们。 ### 一、Java异常处理 #### 1.1 什么是异常 异常是指在程序...
在Java编程语言中,异常处理是一项至关重要的技能,尤其对于初学者来说,理解并熟练掌握异常处理机制是构建健壮...在学习Java基础知识时,务必花时间深入理解和实践异常处理,这对于成为一名合格的Java程序员至关重要。
在这个“JAVA基础教程_异常处理-如何自定义异常”的教程中,我们将深入探讨Java异常处理机制以及如何创建自定义异常。 在Java中,异常是一种特殊的对象,表示在程序执行过程中发生的问题。Java使用了“try-catch-...
Java中的异常处理是通过try、catch、finally以及throw关键字来实现的。try块中包含可能会抛出异常的代码,catch块用于捕获并处理特定类型的异常,finally块则无论是否发生异常都会执行,通常用于进行资源清理工作。 ...
在Java编程语言中,`java.lang.Throwable` 是所有错误(Error)和异常(Exception)的顶级父类,它是异常处理机制的基础。`Throwable` 类提供了封装异常信息的方法和属性,使得开发者能够对程序中出现的问题进行捕获...