java异常代码相关知识
-
Java 异常处理1. Java异常体系 Java异常体系设计的目的在于通过使用少量代码,实现大型、健壮、可靠程序。 1.1. 异常处理 异常处理是Java中唯一正式的错误报告机制。异常处理机制最大的好处就是降低错误代码处理的复杂程度。 如果不使用异常,那么就必须在调用点检查特定的错误,并在程序的很多地方去处理它;如果使用异常,那么就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误。因此只需要在一个地方处理错误,这种方式不仅节省代码,而且把“描述正确执行过程做什么事”和“出了问题
-
JAVA笔记--------异常JAVA中异常就是指代码在运行过程中出行意料之外的事情。准确的来说,就是阻止当前方法或作用域,称之为异常。 异常都继承于一个Throwable类,这个类主要有两个子类,分别为Error类和Exception类。 1、Error类一般很少接触,一般是虚拟机错误或者是内存溢出。 2、Exception类一般有几个问题:编码、环境、用户操作输入出现问题。 Exception类又分为两个子类,RuntimeException类(也被称为非检查异常)和检查异常。 非检查异常一般有几种: 1.空指针异常 NullPointException 2.数组下标越
-
Java异常处理 10 个最佳实践异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中。Java 编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们。事实上,在Java编程中,Java的异常处理不单单是知道语法这么简单,它必须遵循标准的JDK库,和几个处理错误和异常的开源代码。这里我们将讨论一些关于异常处理的Java 最佳实践。1) 为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。选择检查型还是非检查型异常,对于Java编程人员来说,总是让人感到困惑。检查型异常保证你对错误条件提供异常处理代码,这是一种从语言到强制你编写健壮的代码的一种方式,但同时会引入大量杂乱的代码并导致其不可读。当然,如果你有替代品和恢复策略的话,捕捉异常并做些什么看起来似乎也在理。在Java 编程中选择检查型异常还是运行时异常。2)
-
【Java入门提高篇】Day16 Java异常处理(上)当当当当当当,各位看官,好久不见,甚是想念。 今天我们来聊聊Java里的一个小妖精,那就是异常。 什么是异常?什么是异常处理? 异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外的事情,它阻止了程序按照程序员的预期正常执行。 异常处理,应该说异常处理机制,就是专门用来制服这个小妖精的法宝。Java中的异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 简而言
java异常代码相关课程
java异常代码相关教程
- Java 异常处理 Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。本小节我们将介绍什么是异常、Java 中异常类的架构、如何进行异常处理、如何自定义异常、什么是异常链、如何使用异常链等内容。
- 2.4 异常处理 异常处理的老方式是:让每个函数返回一个错误代码,调用者会检查其返回的内容,这样就导致了代码中到处都是错误码的校验,从而让源码变得难以阅读。在异常处理的新方式中,函数或方法不再返回错误码,而是以抛出异常的方式来进行异常处理,在 Java 中可以使用 catch 关键字来捕获在 try 语句块中所发生的异常。这样我们无需频繁通过定义错误代码的方式处理异常,代码可读性大大提高。
- 2. Java 异常类架构 在 Java 中,通过 Throwable 及其子类来描述各种不同类型的异常。如下是 Java 异常类的架构图(不是全部,只展示部分类):
- 7. 异常链 异常链是以一个异常对象为参数构造新的异常对象,新的异常对象将包含先前异常的信息。简单来说,就是将异常信息从底层传递给上层,逐层抛出,我们来看一个实例:public class ExceptionDemo5 { /** * 第一个自定义的静态内部异常类 */ static class FirstCustomException extends Exception { // 无参构造方法 public FirstCustomException() { super("第一个异常"); } } /** * 第二个自定义的静态内部异常类 */ static class SecondCustomException extends Exception { public SecondCustomException() { super("第二个异常"); } } /** * 第三个自定义的静态内部异常类 */ static class ThirdCustomException extends Exception { public ThirdCustomException() { super("第三个异常"); } } /** * 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类 * @throws FirstCustomException */ public static void f1() throws FirstCustomException { throw new FirstCustomException(); } /** * 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类 * @throws SecondCustomException */ public static void f2() throws SecondCustomException { try { f1(); } catch (FirstCustomException e) { throw new SecondCustomException(); } } /** * 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类 * @throws ThirdCustomException */ public static void f3() throws ThirdCustomException { try { f2(); } catch (SecondCustomException e) { throw new ThirdCustomException(); } } public static void main(String[] args) throws ThirdCustomException { // 调用静态方法f3() f3(); }}运行结果:Exception in thread "main" ExceptionDemo5$ThirdCustomException: 第三个异常 at ExceptionDemo5.f3(ExceptionDemo5.java:46) at ExceptionDemo5.main(ExceptionDemo5.java:51)运行过程:通过运行结果,我们只获取到了静态方法 f3() 所抛出的异常堆栈信息,前面代码所抛出的异常并没有被显示。我们改写上面的代码,让异常信息以链条的方式 “连接” 起来。可以通过改写自定义异常的构造方法,来获取到之前异常的信息。实例如下:/** * @author colorful@TaleLin */public class ExceptionDemo6 { /** * 第一个自定义的静态内部异常类 */ static class FirstCustomException extends Exception { // 无参构造方法 public FirstCustomException() { super("第一个异常"); } } /** * 第二个自定义的静态内部异常类 */ static class SecondCustomException extends Exception { /** * 通过构造方法获取之前异常的信息 * @param cause 捕获到的异常对象 */ public SecondCustomException(Throwable cause) { super("第二个异常", cause); } } /** * 第三个自定义的静态内部异常类 */ static class ThirdCustomException extends Exception { /** * 通过构造方法获取之前异常的信息 * @param cause 捕获到的异常对象 */ public ThirdCustomException(Throwable cause) { super("第三个异常", cause); } } /** * 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类 * @throws FirstCustomException */ public static void f1() throws FirstCustomException { throw new FirstCustomException(); } /** * 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类 * @throws SecondCustomException */ public static void f2() throws SecondCustomException { try { f1(); } catch (FirstCustomException e) { throw new SecondCustomException(e); } } /** * 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类 * @throws ThirdCustomException */ public static void f3() throws ThirdCustomException { try { f2(); } catch (SecondCustomException e) { throw new ThirdCustomException(e); } } public static void main(String[] args) throws ThirdCustomException { // 调用静态方法f3() f3(); }}运行结果:Exception in thread "main" ExceptionDemo6$ThirdCustomException: 第三个异常 at ExceptionDemo6.f3(ExceptionDemo6.java:74) at ExceptionDemo6.main(ExceptionDemo6.java:80)Caused by: ExceptionDemo6$SecondCustomException: 第二个异常 at ExceptionDemo6.f2(ExceptionDemo6.java:62) at ExceptionDemo6.f3(ExceptionDemo6.java:72) ... 1 moreCaused by: ExceptionDemo6$FirstCustomException: 第一个异常 at ExceptionDemo6.f1(ExceptionDemo6.java:51) at ExceptionDemo6.f2(ExceptionDemo6.java:60) ... 2 more运行过程:通过运行结果,我们看到,异常发生的整个过程都打印到了屏幕上,这就是一个异常链。
- 6. 自定义异常 自定义异常,就是定义一个类,去继承 Throwable 类或者它的子类。Java 内置了丰富的异常类,通常使用这些内置异常类,就可以描述我们在编码时出现的大部分异常情况。一旦内置异常无法满足我们的业务要求,就可以通过自定义异常描述特定业务产生的异常类型。实例:public class ExceptionDemo4 { static class MyCustomException extends RuntimeException { /** * 无参构造方法 */ public MyCustomException() { super("我的自定义异常"); } } public static void main(String[] args) { // 直接抛出异常 throw new MyCustomException(); }}运行结果:Exception in thread "main" ExceptionDemo4$MyCustomException: 我的自定义异常 at ExceptionDemo4.main(ExceptionDemo4.java:13)运行过程:在代码中写了一个自定义异常 MyCustomException,继承自 RuntimeException,它是一个静态内部类,这样在主方法中就可以直接抛出这个异常类了。当然,也可以使用 catch 来捕获此类型异常。
- 5. 捕获异常 使用 try 和 catch 关键字可以捕获异常。try catch 代码块放在异常可能发生的地方。它的语法如下:try { // 可能会发生异常的代码块} catch (Exception e1) { // 捕获并处理try抛出的异常类型Exception} catch (Exception2 e2) { // 捕获并处理try抛出的异常类型Exception2} finally { // 无论是否发生异常,都将执行的代码块}我们来看一下上面语法中的 3 种语句块:try 语句块:用于监听异常,当发生异常时,异常就会被抛出;catch 语句块:catch 语句包含要捕获的异常类型的声明,当 try 语句块发生异常时,catch 语句块就会被检查。当 catch 块尝试捕获异常时,是按照 catch 块的声明顺序从上往下寻找的,一旦匹配,就不会再向下执行。因此,如果同一个 try 块下的多个 catch 异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面;finally 语句块:无论是否发生异常,都会执行 finally 语句块。finally 常用于这样的场景:由于 finally 语句块总是会被执行,所以那些在 try 代码块中打开的,并且必须回收的物理资源(如数据库连接、网络连接和文件),一般会放在 finally 语句块中释放资源。try 语句块后可以接零个或多个 catch 语句块,如果没有 catch 块,则必须跟一个 finally 语句块。简单来说,try 不允许单独使用,必须和 catch 或 finally 组合使用,catch 和 finally 也不能单独使用。实例如下:public class ExceptionDemo3 { // 打印 a / b 的结果 public static void divide(int a, int b) { System.out.println(a / b); } public static void main(String[] args) { try { // try 语句块 // 调用 divide() 方法 divide(2, 0); } catch (ArithmeticException e) { // catch 语句块 System.out.println("catch: 发生了算数异常:" + e); } finally { // finally 语句块 System.out.println("finally: 无论是否发生异常,都会执行"); } }}运行结果:catch: 发生了算数异常:java.lang.ArithmeticException: / by zerofinally: 无论是否发生异常,都会执行运行过程:divide() 方法中除数 b 为 0,会发生除零异常,我们在方法调用处使用了 try 语句块对异常进行捕获;如果捕获到了异常, catch 语句块会对 ArithmeticException 类型的异常进行处理,此处打印了一行自定义的提示语句;最后的 finally 语句块,无论发生异常与否,总会执行。Java 7 以后,catch 多种异常时,也可以像下面这样简化代码:try { // 可能会发生异常的代码块} catch (Exception | Exception2 e) { // 捕获并处理try抛出的异常类型} finally { // 无论是否发生异常,都将执行的代码块}
java异常代码相关搜索
-
j2ee
j2ee是什么
jar格式
java
java api
java applet
java c
java jdk
java list
java map
java script
java se
java socket
java swing
java switch
java web
java xml
java 程序设计
java 多线程
java 环境变量