异常处理---

article/2025/9/14 0:17:31

异常

在这里插入图片描述
在这里插入图片描述
异常处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例:

public class Demo{public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method(){int[] arr={1,2,3};System.out.println(arr[3]);//数组索引越界,报错}
}

输出:
在这里插入图片描述

异常处理:

public class Demo{public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method(){try{int[] arr={1,2,3};System.out.println(arr[3]);}catch (ArrayIndexOutOfBoundsException e){System.out.println("你访问的数组索引不存在");}}
}

输出:
在这里插入图片描述

public class Demo{public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method(){try {int[] arr={1,2,3};System.out.println(arr[3]);}catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();}}
}

程序会往下执行,并且指出错误。
输出:
在这里插入图片描述

/*
一、异常的处理:抓抛模型
过程一:“抛” 程序正常执行时,一旦出现异常,就会在异常代码处生成
一个对应异常类的对象并抛出。一旦抛出对象以后,后面的代码就不再执行过程二:“抓” 可以理解为异常的处理方式:1.try-catch-finally 2.throws
二、try-catch-finally的使用
try{//可能出现异常的代码
}catch(异常类型1 变量名1){//处理异常的方式1
}catch(异常类型2 变量名2){//处理异常的方式2
}...可以有多个catch
finally{//一定会执行的代码
}说明:
1.finally是可有可没有的,使用try将可能出现异常代码包装起来在执行过程中,
一旦出现异常,就会生成一个对应异常类的对象根据次对象的类型,去catch中进行匹配。
2.一旦try中的异常对象匹配到某个catch时,就进入catch中进行异常的处理,处理完成后,
跳出try-catch结构(没有finally时的情况)。继续执行后面的代码。
3.catch中的异常类型如果没有字父类关系,则谁声明在前都无所谓若满足子父类关系,则要求子类声明在父类上面,否则报错。
4.常用的异常对象处理方式:①String getMessage() ②printStackTrace()这个常用*/
public class Demo1 {public static void main(String[] args) {String str="abc";int num=0;try{num=Integer.parseInt(str);}catch (NumberFormatException e){System.out.println("出现数值转换异常");}System.out.println("11111");}
}

使用try-catch-finally处理编译时异常,则编译时不报错,但运行时仍可能报错
相当于将编译时可能出现的异常,延迟到运行时出现。

finally的使用:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*
1.finally是可有可没有的
2.finally中的代码一定会执行,即使catch中又出现异常,catch或try中有return语句
3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的我们需要自己手动进行资源的释放。此时的资源释放就需要声明再finally中。
4.try-catch-finally结构可以相互嵌套*/
public class Demo {public static void main(String[] args) {FileInputStream fis=null;try {File file=new File("hello.txt");fis=new FileInputStream(file);int data=fis.read();while (data!=-1){System.out.println((char)data);data=fis.read();}}catch (FileNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}finally {//嵌套使用try-catch-finallytry {fis.close();} catch (IOException e) {e.printStackTrace();}}}public void test(){int num=0;String str="aa";try{num=Integer.parseInt(str);}catch (NumberFormatException e){System.out.println("数值类型转换异常");}finally {System.out.println("一定执行的内容");}}
}public class Demo1 {public static void main(String[] args) {try{int a=10;int b=0;System.out.println(a/b);}catch (ArithmeticException e){e.getStackTrace();int[] arr=new int[10];//数组越界,异常,导致程序停止System.out.println(arr[10]);}finally {//finally中的代码仍会执行System.out.println("必须执行的代码");}}public int test1(){//实际返回的值是finally中的return 2try{int a=10,b=0;System.out.println(a/b);}catch (ArithmeticException e){return 1;}finally {return 2;}}
}

其实在实际开发中,由于运行时异常比较常见,所以不去做try-catch处理,编译时异常需要处理。
当finally前面出现System.exit(0)时,(括号内不一定是0,也可以说是1)程序终止,所以finally语句不会执行。

Throwable的成员方法

在这里插入图片描述
在这里插入图片描述
e.printStackTrace()输出的异常信息最全,所以一般使用这个。

编译时异常和运行时异常的区别
也被称为受检异常和非受检异常。
所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常。
编译时异常: 必须显示处理,否则程序就会发生错误,无法通过编译。
在这里插入图片描述
显示处理:
在这里插入图片描述
编译报错只是提示你有可能会出现错误,但不一定真的出现错误,显示处理后该程序没有错误。

运行时异常: 无需显示处理,也可以和编译时异常一样处理。
在这里插入图片描述
处理异常之throws
虽然try…catch…可以对异常进行处理,但并不是所有的情况我们都有权限进行异常的处理。也就是说有些时候可能出现的异常是我们处理不了的,这个时候咋办?
针对该情况,java提供了throws的处理方案。
在这里插入图片描述
在这里插入图片描述
无论是编译时异常还是运行时异常,使用throws都是抛开异常,要想程序继续往下执行,还是要用try…catch…处理,由调用者来处理。
在这里插入图片描述
在这里插入图片描述

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*
异常处理的方式二:throws+异常类型
1.“throws+异常类型“写在方法的声明处。执行此方法时可能会抛出异常类型
一旦方法执行时出现异常,仍会在异常代码处生成一个异常类的对象。次方对象满足throws
后的异常类型时,就会被抛出。
2.一旦抛出异常后,后面的代码不再执行。*/
public class Demo {public static void main(String[] args) {//main中处理异常try{test2();}catch (FileNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}}public static void test2() throws IOException {//该方法调用test() 也处理不了异常,抛给maintest();}public static void test() throws FileNotFoundException,IOException{//该方法处理不了这个异常,抛给test2File file=new File("hello.txt");FileInputStream fis=new FileInputStream(file);int data=fis.read();while (data!=-1){System.out.println((char)data);data=fis.read();}fis.close();}
}

try-catch-finally:真正的将异常给处理掉了。而throws只是将异常抛给了方法的调用者。并没有真正将异常处理掉。

自定义异常类

在这里插入图片描述

import java.util.Scanner;public class EcmDef{public static void main(String[] args) {String str1,str2;Scanner s=new Scanner(System.in);str1=s.nextLine();str2=s.nextLine();int i=0,j=0;try{i=Integer.parseInt(str1);j=Integer.parseInt(str2);int result=ecm(i,j);System.out.println(result);}catch (NumberFormatException e){System.out.println("数据类型不一致");}catch (ArrayIndexOutOfBoundsException e){System.out.println("缺少命令行参数");}catch (ArithmeticException e){System.out.println("除0");}catch (EcDef e){System.out.println(e.getMessage());//获取自定义异常类的信息}}public static int ecm(int i,int j) throws EcDef{if(i<0||j<0){throw new EcDef("分子或分母为负数");//抛出自定义异常}return i/j;}
}
//自定义异常类
class EcDef extends RuntimeException{//自定义一个序列号static final long serialVersionUID=-156461646L;public EcDef(){}public EcDef(String msg){super(msg);}
}

重写方法的异常抛出

import java.io.FileNotFoundException;
import java.io.IOException;/*
重写方法异常抛出的规则
1.子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
2.如果父类没有抛出异常,那么子类也不能抛出异常*/
public class Demo {public static void main(String[] args) {Demo test=new Demo();test.display(new SubClass());//多态}public void display(Super s){try{s.method();}catch (IOException e){e.printStackTrace();}}
}
class Super{public void method() throws IOException{}
}
class SubClass extends Super{public void method() throws FileNotFoundException{}
}

开发中如何选择使用try-catch-finally还是throws?
1.若父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着若子类重写的方法中有异常,必须使用try-catch-finally处理。
2.在执行的方法a中,先后又调用了另外几个方法,且这几个方法是递进关系执行的,建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方法进行处理。

手动抛出异常

关于异常对象的产生:
1.系统自动生成的异常对象
2.手动生成一个异常对象,并抛出(throw)

throws和throw的区别
在这里插入图片描述
throw是手动异常对象的产生,throws是异常处理的一种方式。
先执行finally语句再throw手动抛出异常。

总结

在这里插入图片描述


http://chatgpt.dhexx.cn/article/y8t8lwQZ.shtml

相关文章

异常处理

1.相关概念的介绍 1&#xff09;异常情形&#xff1a;是指阻止当前方法或作用域继续执行的问题。 2&#xff09;监控区域&#xff1a;一段可能产生异常的代码&#xff0c;并且后面跟着处理这些异常的代码。 3&#xff09;try块&#xff1a;如果在方法的内部或者在方法内部调…

异常及异常处理

一、异常的概念 定义&#xff1a; 异常指的是运行期出现的错误&#xff0c;也就是当程序开始执行以后执行期出现的错误。 处理态度&#xff1a; 当捕获到异常以后一定要做出处理&#xff0c;哪怕是把这个异常的错误信息打印出来&#xff0c;这是一种良好的编程习惯。 …

异常处理(throw、throws、try-catch)

Java异常处理的五个关键字try、catch、finally、throw、throws 1.抛出异常throw 在编写程序时&#xff0c;我们必须要考虑程序出现问题的情况。比如&#xff0c;在定义方法时&#xff0c;方法需要接收参数。那么&#xff0c;当调用方法使用接收到的参数时&#xff0c;首先需要…

SpringBoot+Axis2搭建WebService服务端

SpringBootAxis2搭建WebService服务端 之前用过Spring Axis2搭建过WebService项目&#xff0c;网上也有很多资料教程&#xff0c;最近需要在一个SpringBoot项目中添加Axis2的服务端&#xff0c;在网上找了很久&#xff0c;没有找到相关教程&#xff0c;最终经过大神朋友的指点…

AXI(2)完结

四、握手 4.1握手过程 所有的五个通道都是通过相同的VALID/READY握手处理来传输地址、数据和控制信息。 双向握手的机制意味着主机和从机之间传输数据时&#xff0c;都可以控制传输的速率&#xff0c;只有当VALID和READY同时为高电平时&#xff0c;传输才会发生。 发送方&a…

读Axis2用户帮助文档 (axis2中文文档)

作者&#xff1a;李红霞 时间&#xff1a;2006-10-19 声明&#xff1a;本文可以算作Axis2用户手册的翻译&#xff0c;但是翻译后的文本是经过作者理解写出来的&#xff0c;可能有些偏差&#xff0c;欢迎讨论。本文属作者原创&#xff0c;允许转载&#xff0c;但请注明出处。 英…

AXI 3.0 (1)

一、AXI简介 AMBA3.0中新增加了一种总线——AXI&#xff08;Advanced eXtensible Interface&#xff0c;高级扩展接口&#xff09;。 AMBA AXI 协议的目标是高性能、高频的系统设计&#xff0c;其包含了若干特性。 适合高带宽和低延迟的设计 提供高频操作&#xff0c;无需使…

Apache axis2 + Eclipse 开发 WebService

一、简介 Apache Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持&#xff0c;但它具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写&#xff0c;而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化…

Axis2与Web项目整合

一、说明: 上一篇介绍了通过使用Axis2来发布和调用WebService&#xff0c;但是是把WebService发布在Axis2提供的项目中&#xff0c;如果我们需要在自己的Web项目中来使用Axis2发布WebService该怎么做呢&#xff1f; 本篇即介绍在Web项目中使用Axis2来发布WebService. 二、具体…

Axis2中文手册

中文原文 http://tenn.javaeye.com/blog/100736 英文原文 http://ws.apache.org/axis2/1_0/userguide.html 概述 这个说明文档涉及以下内容&#xff1a;  如何使用 axis2 创建 web service 和客户端程序  如何定制一个模块 (Module) 并在 web service 中使用它  Sam…

axis2的使用(转载)

通过axis2发起WS请求时添加SOAP header 首先要获得一个ServiceClient对象&#xff0c;因为这个对象是org.apache.axis2.client.Stub里面定义的&#xff0c;所以你生成的stub里面应该直接就可以使用这个对象&#xff0c;或者调用stub的_getServiceClient()方法来获取这个对象。 …

SpringBoot2 整合 AXIS2 服务端和客户端

文章目录 一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证 二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码. 一、AXIS2服务端 1. 版本选型 阿健/框架版本spring-boot2.5.5axis21.7.…

WebService之Axis2系列教程(一)Axis2的下载、安装和使用

Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如&#xff0c;可以使用WebService来发布服务端 Java类的方法&#xff0c;以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

Axis2 webservice学习总结

一、学习课件目录&#xff1a; Axis2(WebService)培训资料1 - 百度文库 (baidu.com) WebService大讲堂之Axis2 - 百度文库 (baidu.com) 二、学习总结&#xff1a; Web Service是构建互联网分布式系统的基本部件&#xff0c;它是一个应用程序&#xff0c;它向外界暴露出一个…

小白轻松使用axis2构建webservice

引言&#xff1a; 使用axis2是来实现webservice接口是比较常见的&#xff0c;就我来说&#xff0c;如果要学一个首次接触东西&#xff0c;简单了解相关基础概念后&#xff0c;就希望自己能够简单快速的实现一个例子&#xff0c;在学习一门开发语言的时候&#xff0c;一个hello…

模板引擎 Velocity语法

Velocity是一个基于java的模板引擎&#xff08;template engine&#xff09;&#xff0c;它允许任何人仅仅简单的使用模板语言&#xff08;template language&#xff09;来引用 由java代码定义的对象。作为一个比较完善的模板引擎&#xff0c;Velocity的功能是比较强大的&…

velocity 模板语法

velocity 模板语法 前言1. 访问1.1 变量1.2 属性1.3 方法 2. 指令2.1 #set 创建变量2.2 #if/#elseif/#else 分支控制2.3 #foreach 循环控制2.4 #include - 引入本地文件&#xff0c;文本展示2.5 #parse - 引入本地文件&#xff0c;velocity 解析后展示2.6 #stop - 停止模板解析…

finalize() 原理

finalize 方法的作用是&#xff1a; 如果对象在进行可达性分析后发现没有与 GC Roots 相连接的引用链&#xff0c;那他将会被第一次标记并且进行一次筛选&#xff0c;筛选的条件是此对象是否有必要执行 finalize 方法。 注意&#xff1a;当对象没有覆盖 finalize 方法&#xf…

finalize()

注&#xff1a;本文的目的并不是鼓励使用finalize方法&#xff0c;而是大致理清其作用、问题以及GC执行finalize的过程。 1. finalize的作用 finalize()是Object的protected方法&#xff0c;子类可以覆盖该方法以实现资源清理工作&#xff0c;GC在回收对象之前调用该方法。fina…

java finalize方法详解

1. finalize的作用 finalize()是Object的protected方法&#xff0c;子类可以覆盖该方法以实现资源清理工作&#xff0c;GC在回收对象之前调用该方法。finalize()与C中的析构函数不是对应的。C中的析构函数调用的时机是确定的&#xff08;对象离开作用域或delete掉&#xff09;&…