java中的异常 最详细的讲解

2023-11-15

一、异常的概念

异常:在程序执行的过程中,出现的非正常情况,最终会导致JVM非正常停止

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处 理异常的方式是中断处理

异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.

Throwable中的常用方法:

public void printStackTrace() :打印异常的详细信息。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

public String getMessage() :获取发生异常的原因。 提示给用户的时候,就提示错误原因。

public String toString() :获取异常的类型和异常描述信息(不用)。

二、异常的分类

Error:严重错误Error,无法通过处理的错误,只能事先避免

Exception:分为编译器异常和运行时异常

编译期异常,写代码的时候程序出现问题。可以由程序员写的时候解决

Exception也有子类RuntimeException运行期异常,程序运行时可以抛出的异常。

throws抛出异常,交给虚拟机处理,是中断程序执行的

try catch是会把后续代码执行

三、异常的产生过程解析

 

 四、异常处理

1.抛出异常throw关键字

作用:可以使用ts关键字在指定的方法中抛出指定的异常

格式:throw new xxxException(异常原因)

例如:

throw new NullPointerException("要访问的arr数组不存在");

throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");

注意:1.throw关键字必须写在方法的内部

2.throw关键字后边new的对象必须是Exception的子类对象

3.throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

throw关键字后边创建的是RuntimeException或RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)

    throw关键字后边创建的是编译异常(写代码报错)就必须处理这个,要么throws要么try..catch

 NullPointException 空指针异常是运行期异常

 ArrayIndexOutOfBoundsException数组越界异常,运行期异常

 2.声明异常throws

 异常处理的第一种方式

作用:当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象

            可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己                不处理,给别人处理)最终交给JVM处理->中断处理

使用格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{

                 throw new xxxException(异常原因)....

                  }

注意:1.throws必须写在方法声明处

           2.throws后面生命的异常必须是Exception或Exception的子类对象

           3.方法内部如果抛出多个异常对象,那么throws后面也要声明多个异常

              如果抛出的异常有父子类关系,直接声明父类异常就行

           4.调用了一个声明抛出异常的方法,我们就必须处理声明的异常,

                要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM

                要么try catch自己处理

public class ThrowsDemo {
public static void main(String[] args) throws FileNotFoundException {
read("a.txt");
}
//定义一个方法,判断文件路径是不是a.txt
// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
//FileNotFoundException是编译时异常
}
}

3.捕获异常try…catch

  异常处理的第二种方式

public class TryCatchDemo {
public static void main(String[] args) {
try {// 当产生异常时,必须有处理方式。要么捕获,要么声明。
//try中写可能有异常的语句
read("b.txt");
} catch (FileNotFoundException e) {// 括号中需要定义什么呢?
//try中抛出的是什么异常,在括号中就定义什么异常类型
System.out.println(e);
}
System.out.println("over");
}
/*
*
* 我们 当前的这个方法中 有异常 有编译期异常
*/
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}

如何获取异常信息: Throwable类中定义了一些查看方法:

public String getMessage() :获取异常的描述(简短)信息,原因(提示给用户的时候,就提示错误原因。

public String toString() :获取异常的类型和异常描述信息(不用)。

public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台。 JVM打印异常对象,默认此方法,打印的异常信息是最全面的

4.finally 代码块

finally:有一些特定的代码无论异常是否发生,都需要执行。

finally的语法: try...catch....finally:自身需要处理异常,最终还得关闭资源。

注意:1.finally不能单独使用,必须和try一起

           2.finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要释放资源 

public class TryCatchDemo4 {
public static void main(String[] args) {
try {
read("a.txt");
} catch (FileNotFoundException e) {
//抓取到的是编译期异常 抛出去的是运行期
throw new RuntimeException(e);
} finally {
System.out.println("不管程序怎样,这里都将会被执行。");
}
System.out.println("over");
}
/*
*
* 我们 当前的这个方法中 有异常 有编译期异常
*/
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}

五、异常注意事项

多个异常使用捕获又该如何处理呢?

1. 多个异常分别处理。

2. 多个异常一次捕获,多次处理。

3. 多个异常一次捕获一次处理。

般我们是使用一次捕获多次处理方式,格式如下:

try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异 常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理

原因如下:

运行时异常被抛出可以不处理。即不捕获也不声明抛出。交给JVM处理

如果finally有return语句,永远返回finally中的结果,避免该情况.

如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。  父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不 能声明抛出。(也就是说,父类异常是什么样,子类异常就是什么样)

 六、自定义异常

为什么需要自定义异常类:java提供的异常类,不够我们使用,需要自己定义一些

格式:public class xxxException extends Exception/RuntimeException  {

              添加一个空参数构造方法

               添加一个带异常信息的构造方法}

异常类如何定义: 1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。 2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException 。

// 业务逻辑异常
public class RegisterException extends Exception {
/**
* 空参构造
添加一个空参数构造方法
*/
public RegisterException() {
}
/**
*
* @param message 表示异常提示
添加一个带异常信息的构造方法
*/
//查看源码发现,所有的异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息的构造方法,让父类来处理这个异常信息
public RegisterException(String message) {
super(message);
}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的异常 最详细的讲解 的相关文章

  • JSON - 使用Gson反序列化动态对象

    假设我有一个以下类型的 Java 类 public class MyClass public String par1 public Object par2 然后我有这个 String json par1 val1 par2 subpar1
  • SLF4J - Logback:如何在运行时配置记录器?

    我们在项目中使用 LogBack 我想根据一些数据库值配置记录器 即如果某个数据库值设置为 true 则记录器应同时使用文件和数据库附加程序 如果为 false 则记录器必须仅使用数据库附加程序 我还想保留使用静态最终记录器 因此我不会在每
  • 将用户库添加到 Ant Builder 类路径

    我在为 Eclipse 项目设置 Ant Builder 时遇到问题 我确实在 Eclipse 中将几个第 3 方库配置为用户库 这些库已添加到我的项目的构建路径中 一切正常 我的问题是 如果我想从 Eclipse 使用 Ant Build
  • 哪个 new 首先执行——在构造函数中还是在构造函数外?

    如果我定义一个类如下 public class myClass private x new anotherClass private y public myClass y new anotherClass 哪个变量会更早获得实例 x 或 y
  • spring boot框架下如何过滤tomcat产生的访问日志

    我们使用spring boot框架 通过嵌入式tomcat生成访问日志 访问日志的格式如下 server tomcat access log enabled true server tomcat access log pattern h l
  • 如何在 Spring Boot 1.4 中自定义 Jackson

    我一直无法找到如何使用的示例Jackson2ObjectMapperBuilderCustomizer java在spring boot 1 4中自定义Jackson的功能 boot 1 4 中自定义 Jackson 的 doco http
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • Spring Batch 多线程

    我正在编写一个 Spring Batch 并希望在需要时对其进行扩展 我的 ApplicationContext 看起来像这样 Configuration EnableBatchProcessing EnableTransactionMan
  • Android 背景 + 文本 + 按钮图标

    我想要一个图像设置为文本的背景 并在文本的左侧设置一个图标 在iPhone中非常简单 但不知道如何在Android上做到这一点 调整按钮的大小并保持图标 文本的位置和距离正确 iPhone 安卓我有这个 xml代码是
  • 找不到模块:javafx.controls

    我已经下载了JavaFX SDK 解压它并设置PATH TO FX系统变量 如下本说明 https openjfx io openjfx docs install javafx 我使用了以下代码示例 import javafx applic
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • 使用 Spring 注入 Google Guava Hashmultimap

    是否可以提供一个创建示例Multimap
  • 摆动刷新周期

    我试图了解何时使用重新验证 重绘 打包 令人惊讶的是 我没有找到详细的底层文档 请随意链接 到目前为止我已经明白这都是 RepaintManager 的责任 油漆 重新油漆指的是脏 干净的东西 pack validate revalidat
  • 如何从 REstAssured 中的 Json 数组获取 JSON 对象

    任何人都可以帮我解决这个场景 我是新来的RestAssured和处理JSON在我们的自动化脚本中 我有一个API谁的回应是JSONArray i e id 1002 entity testcase fieldName TextName di
  • Hibernate3:自引用对象

    需要一些帮助来了解如何执行此操作 我将在文件系统上运行递归 查找 并且希望将信息保留在单个数据库表中 具有自引用的层次结构 这是我想要填充的数据库表结构 目录对象表 id int NOT NULL name varchar 255 NOT
  • 获取运行时生成的类的字节

    我正在使用一个 Java 框架 该框架使用自定义类加载器在运行时生成一些 代理 类 我想为任何这样的类获取自定义 ClassLoader 从 loadClass 返回的与该类对应的原始字节数组 这可能吗 我知道 如果一个类作为资源存在 那么
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • Java 通用问题

    下面的代码可以编译 但如果我取消注释行 它不会编译 我很困惑为什么 HashMap 确实扩展了 AbstractMap 并且声明映射的第一行可以正常编译 import java util AbstractMap import java ut
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • @JsonCreator '无法找到具有名称的创建者属性',即使使用ignoreUnknown = true

    我有以下课程 JsonIgnoreProperties ignoreUnknown true public class Topic private List

随机推荐