FLYPRO飞豹携XEagle无人机 亮相2016全球最大无人机展AUVSI XPONENTIAL
06-18
简介 异常处理就像穿内衣一样。戴了就不能轻易给别人看,更别说不戴了。
不然,等海浪退去,沙滩上裸奔的就是你了。异常是程序执行过程中发生的、影响程序正常流程的错误事件。
当一个方法遇到异常时,它通常会创建一个包含异常信息的对象,然后将控制权交给程序中的某个位置,该位置可以是异常处理代码或调用堆栈的其他部分。 Java中的异常处理机制是基于传统的C++异常处理机制,这迫使程序员捕获可能的异常并进行处理。
这会提高程序的可靠性,因为异常不再被忽略,而是被显式处理。异常处理的主要目标是使程序更具可读性和可维护性,因为异常处理代码通常集中在一起,而不是分散在程序的各个部分。
通过使用异常,程序员可以更轻松地理解和维护代码,因为异常处理代码与正常业务逻辑分离。在Java中,异常是在程序执行期间发生的意外情况,可能导致程序终止或产生不确定的结果。
异常分为两种类型:检查异常和非检查异常。检查异常通常表示程序无法预测的外部条件,例如文件不存在或网络连接中断。
未经检查的异常通常表示程序中的错误,例如空指针引用或数组越界。无论如何,异常提供了一种将错误处理代码与正常业务逻辑分开的方法,以确保程序的健壮性。
异常分为两类:已检查异常和未检查异常。检查异常(Checked Exceptions)是在编译时检查的,必须在代码中处理,否则程序将无法编译。
常见示例包括 IOException 和 SQLException。您可以使用 try-catch 块来捕获并处理这些异常,或者在方法签名中使用 throws 关键字来声明方法可能抛出的异常。
代码语言:javascript copy try { // 一些可能抛出异常的代码 } catch (IOException e) { // 处理 IOException } catch (SQLException e) { // 处理 SQLException } Unchecked Exceptions(未检查异常)异常 通常是由程序引起的错误并在运行时检测到。常见示例包括 NullPointerException 和 ArrayIndexOutOfBoundsException。
通常,最好通过编码和设计来避免这些异常。但如果确定无法避免,可以使用try-catch来处理。
代码语言: javascript copy try { // 一些可能会抛出异常的代码 } catch (NullPointerException e) { // 处理 NullPointerException } catch (ArrayIndexOutOfBoundsException e) { // 处理 ArrayIndexOutOfBoundsException e) { // 处理 ArrayIndexOutOfBoundsException } finally 块:无论异常是否被捕获,finally block 中的所有代码都会被执行。这通常用于确保资源的释放,例如关闭文件或网络连接。
代码语言: javascript copy try { // 一些可能抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 无论是否发生异常,这里的代码都会被执行 } 这是基础Java 异常处理概念。了解异常机制并适当处理异常可以帮助您编写更稳定可靠的Java代码。
Java异常类层次结构图 Java异常类层次结构图主要分为两个分支: Throwable是根类,分为两个主要子类:Error和Exception。 ThrowableError(错误)代表系统级错误,通常由虚拟机报告。
程序通常无法捕获此类错误,因为它们代表了程序无法恢复的严重问题。 OutOfMemoryError: 内存耗尽 StackOverflowError: 堆栈溢出 Exception(异常)代表程序运行过程中出现的异常情况,分为受检查异常和非受检查异常。
检查异常需要在代码中显式处理或声明可能在方法签名中引发的异常。 IOException:输入输出异常 SQLException:数据库访问异常 未检查异常(Unchecked Exceptions)通常是由程序错误引起的,不需要显式处理。
RuntimeException:运行时异常的基类 NullPointerException:空指针异常 ArrayIndexOutOfBoundsException:数组下标越界异常 ArithmeticException:算术异常 IllegalArgumentException:非法参数异常 ClassCastException:类强制转换异常等...这只是异常类层次结构的概述,实际上Java提供了众多的异常类来涵盖各种可能的异常情况。理解这种层次结构对于编写健壮的 Java 代码至关重要。
Exception关键字trytry关键字用于定义可能抛出异常的代码块。在此代码块中,您可以放置??可能引发异常的语句。
代码语言:java copy try { // 可能引发异常的代码 } catch (Exception e) { // 处理异常的代码 } finally { // 无论是否发生异常都会执行的代码 } catchcatch 关键字用于捕获并处理异常。在 catch 块中,您可以指定要捕获的异常类型并编写代码来处理异常。
代码语言:java copy try { // 可能引发异常的代码 } catch (ExceptionType e) { // 处理特定类型异常的代码 } finallyfinally 关键字用于定义一个代码块,其中的代码无论发生什么情况都会被执行是否出现异常。实施。
通常用于清理资源或确保某些代码始终执行。代码语言:java copy try { // 可能抛出异常的代码 } catch (Exception e) { // 处理异常的代码 } finally { // 无论是否发生异常都会执行的代码 } throw throw关键字用于手动抛出异常。
您可以使用它来抛出特定类型的异常对象。代码语言:java copy throw new MyException("这是一个用户异常"); throwsthrows 关键字用于声明方法签名中可能抛出的异常。
它告诉调用者可能需要处理的异常类型。代码语言: javascript copy void myMethod() throws MyException { // 方法体 } 这些关键字共同构成了Java中的异常处理机制。
通过它们,可以更好地管理和处理程序中的异常。 throw 和 throws 关键字 throw 关键字:用于手动抛出异常,即在代码中显式指定抛出异常对象。
语法:抛出异常对象;使用 throw 关键字时,在代码中显式指定抛出异常对象。这通常发生在方法内部,这意味着在某些条件下手动引发异常。
下面是一个简单的例子: 代码语言:java 复制包 com.example.demo.exception;公共类ExampleThrow { 公共静态void main(String[] args) { 尝试{ validateAge(15); } } catch (CustomException e) { System.out.println("捕获异常:" + e.getMessage()); } } static void validateAge(int Age) throws CustomException { if (age < 18) { throw new CustomException("年龄必须是 18 岁或以上"); } else { System.out.println("有效年龄:" + 年龄); } }}class CustomException 扩展了 Exception { public CustomException(String message) { super(message); }}在此示例中,validateAge 方法接受年龄参数。如果年龄小于18岁,则使用 throw 关键字手动抛出 CustomException 异常。
在main方法中,我们调用validateAge(15),由于年龄小于18,它会抛出异常,我们在catch块中捕获并处理这个异常。 throws关键字:用于在方法签名中声明可能抛出的异常类型,通常用于告诉调用者可能需要处理的异常。
语法: void myMethod() throws MyException { // 方法体 } 现在,让我们看看 throws 关键字的用法。throws 通常用于声明方法签名中可能引发的异常类型。
示例如下: 代码语言:java 复制包 com.example.demo.exception;公共类ExampleThrows { 公共静态void main(String[] args) { 尝试{ processInput(25); }处理输入(-5); } catch (CustomException e) { System.out.println("捕获异常:" + e.getMessage()); } } static void processInput(int input) throws CustomException { if (input < 0) { throw new CustomException("输入不能为负数"); } else { System.out.println("已处理的输入:" + input); } }}class CustomException 扩展了 Exception { public CustomException(String message) { super(message); }}在此示例中, processInput 方法声明它可能抛出 CustomException。在main方法中,我们调用processInput(25),由于输入是正数,所以不会抛出异常。
如果我们调用 processInput(-5),则会抛出 CustomException,因为输入为负数。总结一下: throw 用于在代码中手动抛出异常。
throws用于在方法签名中声明可能抛出的异常类型,以便调用者知道需要处理哪些异常。创建一个继承自 Exception 或其子类的自定义异常类。
可以添加构造函数,通常通过调用父类的构造函数来设置异常消息。代码语言:java copy public class CustomException extends Exception { public CustomException() { super(); } 公共 CustomException(字符串消息) { 超级(消息); }} 异常捕获try-catch示例: 代码语言:java copy public class TryCatchExample { public static void main(String[] args) { try { int result =divide(10, 0); } System.out.println("结果:" + 结果); } catch (ArithmeticException e) { System.out. println("错误:" + e.getMessage()); } } static int 除(int 分子, int 分母) { 返回分子/分母; }}解释:在try块中,我们尝试执行除法运算。
如果分母为零,则抛出 ArithmeticException。在 catch 块中,我们捕获并处理 ArithmeticException 并打印错误消息。
try-catch-finally 示例: 代码语言:java copy public class TryCatchFinallyExample { public static void main(String[] args) { try { int result =divide(10, 0); } System.out.println("结果:" + 结果); } catch (ArithmeticException e) { System.out.println("错误:" + e.getMessage()); } finally { System.out.println("这个块总是执行。"); } } static int 除(int 分子, int 分母) { 返回分子/分母; }}说明:与前面的示例类似,但有一个额外的finally 块。
无论是否发生异常,finally 块中的代码都会执行。这在您需要确保释放或清理资源的情况下非常有用。
try-finally 示例: 代码语言:java copy public class TryFinallyExample { public static void main(String[] args) { try { // 一些可能抛出异常的代码 } finally { System.out.println("这个块总是执行 . ”); } }}说明:此示例没有 catch 块,只有 try 块和 finally 块。无论是否发生异常,finally 块中的代码都会执行。
这在您只关心资源清理而不关心异常处理的情况下非常有用。try-with-resources try-with-resources是Java 7中引入的语法糖,用于更方便地管理资源,例如文件、网络连接等,而无需在代码中显式添加资源关闭语句。
此语法确保在 try 块末尾,括号内声明的所有资源都被关闭,即使 try 块内发生异常也是如此。示例: 代码语言: javascript copy package com.example.demo.exception;import java.io.FileReader;import java.io.BufferedReader;import java.io.IOException;public class TryWithResourcesExample { public static void main(String[] args ) { // 使用 try-with-resources 读取文件内容 try (FileReader fileReader = new FileReader("E:\\example.txt"); BufferedReader bufferedReader = new BufferedReader(fileReader)) { String line; } // 逐行读取文件内容 while ((line = bufferedReader.readLine()) != null) { System.out.println("从文件中读取: " + line); } } catch (IOException e) { System.out.println( "读取文件时出错:" + e.getMessage()); } }}在此示例中,我们使用 try-with-resources 来读取文件内容。
FileReader 和 BufferedReader 是实现 AutoCloseable 接口的资源。这两个资源在try括号内声明,不需要手动关闭,它们会在try块末尾自动关闭。
注意:资源必须实现 AutoCloseable 或 Closeable 接口。当try-with-resources语句结束时,资源会按照声明的相反顺序关闭,即先声明的资源先关闭。
资源以与声明相反的顺序关闭,因为稍后声明的资源可能依赖于较早声明的资源。异常的主要观点及异常基本概念总结: 异常是程序运行中出现的问题,可能导致程序无法继续正常执行。
异常分为两类:Error 和 Exception。其中,Error代表严重的问题,通常是不可恢复的,而Exception代表可以捕获并处理的问题。
异常处理的优点:异常处理提供了一种机制,允许程序员在异常发生时采取特定的操作,而不是简单地让程序崩溃。异常处理使得程序更加健壮,能够更好地适应和响应各种运行时问题。
捕获并处理异常:使用 try-catch 块捕获并处理异常,防止它们传播到程序的上层。正确选择捕获和处理异常可以使程序更易于调试和维护。
异常层次结构:异常类之间形成层次结构,允许程序员根据特定的异常类型来捕获和处理异常。异常的层次结构有助于更精细地处理不同类型的异常。
finally块的作用:无论是否发生异常,finally块中的代码都会被执行。 finally 块通常用于确保资源的释放或清理。
自定义异常:程序员可以根据需要创建自定义异常类,使异常信息更加具体和有意义。自定义异常有助于更好地反映程序的逻辑结构和错误情况。
关于异常和错误处理的哲学观点:程序员应该在可以合理处理的地方捕获并处理异常,而不是简单地忽略或直接传播异常。异常处理应该是程序设计的一部分,而不仅仅是错误响应机制。
常见异常类 Checked Exceptions IOException:描述输入输出操作中可能出现的问题,如文件不存在、无法读写等。 FileNotFoundException:继承自 IOException,表示试图访问某个文件但该文件不存在。
ParseException:描述解析操作可能出现的问题,通常与日期和时间解析有关。ClassNotFoundException:描述尝试加载类时找不到类的情况。
SQLException:描述与数据库相关的问题,例如连接失败、SQL语句执行错误等。 :InterruptedException:描述一个线程在等待对象上的锁时被其他线程中断。
FileNotFoundException:继承自IOException,表示尝试访问文件但该文件不存在。 ParseException:描述解析操作可能出现的问题,通常与日期和时间解析有关。
ClassNotFoundException:描述尝试加载类时找不到类的情况。未经检查的异常 NullPointerException:当尝试访问其属性或调用方法时,该对象为 null。
ArrayIndexOutOfBoundsException:尝试访问超出范围的数组索引。 ArithmeticException:执行数学运算(例如除以零)时发生错误。
IllegalArgumentException:该方法接收到非法参数。 IllegalStateException:对象处于不正确的状态。
NumberFormatException:将字符串转换为数字时,字符串格式不正确。 ClassCastException:尝试将对象转换为其子类,但实际对象类型不允许此类转换。
NullPointerException:尝试调用空对象的方法或访问属性。除了未检查的异常和检查的异常之外,Java还包括一些其他类型的异常。
这些异常通常是 Error 类的子类,代表更严重且通常无法恢复的问题。以下是其他一些常见异常: 错误异常 OutOfMemoryError:当 Java 虚拟机耗尽内存资源而无法继续分配时,抛出此错误。
StackOverflowError:当由于递归调用或方法调用层次太深而导致堆栈空间不足时,会抛出此错误。 NoClassDefFoundError:当Java虚拟机尝试加载类但找不到该类的定义时,会抛出此错误。
LinkageError:当类的链接过程失败时抛出此错误。例如,虚拟机找到了类的定义,但找不到该类的父类。
AssertionError:当断言语句(assert)失败时抛出此错误。通常在开发和调试阶段使用。
ExceptionInInitializerError:类的初始化过程中发生异常时抛出此错误。通常异常发生在类的静态初始化块中。
我正在参加腾讯科技创造特训营第四期有奖征文比赛。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-06
06-18
06-06
06-17
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用