Java的异常入门

概念:

异常就是程序出现了不正常的情况,会导致JVM非正常停止,语法错误不算异常体系中

异常体系:

请添加图片描述

编译时异常&运行时异常:

请添加图片描述

虚拟机默认处理方式:
  • 代码中出现异常,程序会先判断有没有处理异常的代码,如果没有就会让调用者(虚拟机)处理,如果有就会走处理的代码。
  • 虚拟机会做两件事情;
  1. 虚拟机会把异常的名称,错误原因及异常出现的位置等信息输出在控制台
  2. 程序停止执行,哪里出现异常就在哪里停止,下面的代码都不会再走
throws方式处理异常:
  • throws: 声明异常,定义在方法括号后面,表示调用该方法会出现异常
  • 编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
  • 运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理

格式:

 public void 方法() throws 异常类名 {}

代码演示:

      public static void main(String[] args) throws ParseException{System.out.println("开始"); //        method();    // 这里调用者也没有处理异常,最终还是虚拟机处理method2();   // 这里调用者也没有处理异常,最终还是虚拟机处理System.out.println("结束");}//编译时异常public static void method2() throws ParseException {String s = "2048-08-09";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date d = sdf.parse(s);System.out.println(d);}//运行时异常public static void method() throws ArrayIndexOutOfBoundsException {int[] arr = {1, 2, 3};System.out.println(arr[3]);}
throw抛出异常:
  • throw:抛出异常对象,定义在方法里面,由方法体内的语句处理,编译时异常因为在编译时就要检查,所以必须要写在方法后面进行显示声明
  • 这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了

格式:

throw new 异常();
      public static void main(String[] args) {//int [] arr = {1,2,3,4,5};int [] arr = null;printArr(arr);//就会 接收到一个异常.//我们还需要自己处理一下异常.}private static void printArr(int[] arr) {if(arr == null){//调用者知道成功打印了吗?//System.out.println("参数不能为null");throw new NullPointerException(); //当参数为null的时候//手动创建了一个异常对象,抛给了调用者,产生了一个异常}else{for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}

抛出异常使用场景:

  • 告诉调用者方法中出现了问题 在方法传递参数有误,没有继续运行下去的意义就要抛出异常,让方法结束
  • 有异常不是直接交给JVM去处理的,而是先看看有没有自己处理,没有才去交给JVM
throws和throw的区别:
throwsthrow
用在方法声明后面,跟的是异常类名用在方法体内,跟的是异常对象名
表示声明异常,调用该方法有可能会出现这样的异常表示手动抛出异常对象,由方法体内的语句处理
try-catch方式处理异常:

好处:为了让代码继续往下执行

格式:

  try {可能出现异常的代码;} catch(异常类名 变量名) {异常的处理代码;}

执行流程:

  1. 程序从 try 里面的代码开始执行
  2. 出现异常,就会跳转到对应的 catch 里面去执行
  3. 执行完毕之后,程序还可以继续往下执行

代码演示:

      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]);System.out.println("这里能够访问到吗");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");}}
try…catch常见问题:
  1. try没有遇到问题怎么执行?

会把try中所有的代码全部执行完毕,不会执行catch里面的代码

  1. try遇到问题, try下面的还会执行吗?

不会,直接跳转到对应的catch语句中,try下面的代码就不会再执行了,当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

  1. 如果出现的问题没有被捕获,那么程序如何运行?

相当于自己没有处理,默认交给虚拟机处理

  1. 同时有可能出现多个异常怎么处理?

出现多个异常,就要写多个catch,如果多个异常之间存在子父类关系,那么父类一定要写在下面

  1. 为什么不直接使用Exception呢?

根据需求,不同的异常会有不同的处理方式,使用Exception就相当于,不管什么异常都统一处理

Throwable成员方法:
方法名说明
public String getMessage()返回此 throwable 的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

代码演示:

    public static void main(String[] args) {try {int[] arr = {2, 3, 4};System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {System.out.println(e.getMessage());System.out.println(e.toString());e.printStackTrace();} finally {System.out.println("我是finally,我一定会执行")}}
finallly:
  • 被finally控制的语句一定会执行,除非JVM退出
  • 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
  • 如果try中有return会先执行finally中的语句再执行try中的returne
  • 如果finally中有returne的,会覆盖其他地方的return。
自定义异常:

为什么要自定义异常?

JDK提供的异常虽然比较多,但是不一定符合我们的需求.,此时我们可以根据自己的业务来定义异常类。
例如年龄负数问题,考试成绩负数问题。

自定义异常的步骤:

  1. 定义异常类
  2. 写继承关系
  3. 提供空参构造
  4. 提供带参构造

代码演示:

异常类:

public class AgeOutOfBoundsException extends RuntimeException {public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message){super(message);}
}

学生类:

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age >= 18 && age <= 25){this.age = age;}else{//自定义异常,指向定义的异常类throw new AgeOutOfBoundsException("年龄超出了范围");}}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}

测试类:

public class TestStudent {public static void main(String[] args) {// 键盘录入学生的姓名和年龄,其中年龄为18 - 25岁,超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止Student s = new Student();Scanner sc = new Scanner(System.in);System.out.println("请输入姓名");String name = sc.nextLine();s.setName(name);while (true) {System.out.println("请输入年龄");try {String agetest = sc.nextLine();int age = Integer.parseInt(agetest);s.setAge(age);break;} catch (NumberFormatException e) {System.out.println("请输入一个整数");continue;} catch (AgeOutOfBoundsException e) {System.out.println("请输入规定年龄");continue;}}System.out.println(s);}
}
Optional:

Optional:可以传递一个为空的的对象,也可以传递一个不为空的
构造方法:

方法名说明
static Optional of(T value)获取一个Optional对象,封装的是非null值的对象
static Optional ofNullable(T value)获取一个Optional对象,Optional封装的值对象可以是null也可以不是null

常用方法:

方法名说明
T get()如果存在值,返回值,否则抛出NoSuchElementException
boolean isPresent()如果存在值,则返回true,否则为false

代码演示:

    public static void main(String[] args) {Student s = null;Optional<Student> optional = Optional.ofNullable(s);//如果封装的是一个null,那么通过get方法再次获取会抛出NoSuchElementException。if (optional.isPresent()) {Student student = optional.get();System.out.println(student);} else {System.out.println("Optional封装的对象为空");}}

处理空指针的方法:

方法名说明
T orElse(T other)如果不为空,则返回具体的值,否则返回参数中的值
T orElseGet(Supplier<? extends T> supplier)如果不为空,则返回具体的值,否则返回由括号中函数产生的结果
void ifPresent (Consumer<? super T> action)如果不为空,则使用该值执行给定的操作,否则不执行任何操作
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)如果不为空,则使用该值执行给定的操作,否则执行给定的基于空的操作

代码演示:

      public static void main(String[] args) {//method1();//method2();//method3();//method4();}private static void method4() {//Student s = new Student("zhangsan",23);Student s = null;Optional<Student> optional = Optional.ofNullable(s);//public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)、//如果不为空,则使用该值执行给定的操作,否则执行给定的基于空的操作。optional.ifPresentOrElse(student -> System.out.println(student),()->System.out.println("为空了"));}private static void method3() {//Student s = new Student("zhangsan",23);Student s = null;Optional<Student> optional = Optional.ofNullable(s);//ifPresent (Consumer<? super T> action)//如果不为空,则使用该值执行给定的操作,否则不执行任何操作optional.ifPresent(student -> System.out.println(student));}private static void method2() {Student s = new Student("zhangsan",23);//Student s = null;Optional<Student> optional = Optional.ofNullable(s);//orElseGet(Supplier<? extends T> supplier)//如果不为空,则返回具体的值,否则返回由括号中函数产生的结果Student student = optional.orElseGet(()-> new Student("lisi" , 24));System.out.println(student);}private static void method1() {//Student s = new Student("zhangsan",23);Student s = null;Optional<Student> optional = Optional.ofNullable(s);//orElse(T other) 如果不为空,则返回具体的值,否则返回参数中的值Student student = optional.orElse(new Student("lisi", 24));System.out.println(student);}
IO异常的处理:

JDK1.7以前的

1.创建流有异常,使用try处理
2.IO流一定要关闭,在finally中来关闭
3.将fis声明放到try的外面
4.fis可能是null,null不能调用方法,需要判断fis!=null,再做close
5.close有异常,再try
6.read方法有异常,添加一个catch分支

  public static void test02() {try (FileInputStream fis = new FileInputStream("day10demo\\abc\\in.txt");FileOutputStream fos = new FileOutputStream("day10demo\\abc\11.txt");) {fis.read(); // 读取数据} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

JDK1.7的处理方式

会自动关流
try (创建流的代码) {
其他代码;
} catch (异常类名 变量名) {
处理异常代码
}

public static void test01() {FileInputStream fis = null;try {fis = new FileInputStream("day10demo\\abc\\in.txt");fis.read();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java——多线程使用详解

多线程&#xff1a; 多线程就是同时执行多个应用程序&#xff0c;需要硬件的支持同时执行&#xff1a;不是某个时间段同时&#xff0c;cpu切换的比较快&#xff0c;所有用户会感觉是在同时运行 并发与并行&#xff1a; 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多…

php边框的颜色 怎么设置,网页中table表格如何修改边框颜色

table表格是网页制作中以前较常使用的一种布局方式&#xff0c;但随着DIVCSS的兴起&#xff0c;table表格已辉煌不在。但它在我们制作网页中也是时有用到。table表格也可以使用DIV一样随意的设置它的边框颜色。下面介绍一下二种方法。方法一&#xff1a;使用CSS代码控制边框颜色…

看懂线程安全

目录&#xff1a; 线程安全线程同步同步代码块同步方法Lock锁线程状态图sleep睡眠等待和唤醒 1. 线程安全 如果有多个线程在同时运行&#xff0c;而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样 的&#xff0c;而且其他的变量的值也和预期的是…

oracle数据库生产,从安装系统到oracle数据库生产环境(centos6.8)搭建

大纲服务器安装JDK配置Oracle数据库安装配置1.安装服务器服务器的安装参考这篇教程关于安装中可能出现的几个问题&#xff0c;在这里进行解决&#xff1a;1、使用u盘安装完后&#xff0c;系统进入GRUB引导&#xff0c;无法启动&#xff1a;解决办法&#xff1a;出现上述状况的原…

详解线程池

概念&#xff1a; 什么是线程池: 线程池是用来存储多线程的容器&#xff0c;是一种处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。 线程池使用和不使用的区别&#xff1a; 因为系统创建线程池的成本很高&#xff0c;会涉及到…

oracle 10g express linux,在Ubuntu下安装Oracle Database 10g Express Edition

Oracle 10g有一款XE版&#xff0c;意为体验版&#xff0c;限制是不支持多CPU和数据库大小不能超过2G(还有其他的什么&#xff0c;不记得了&#xff0c;Oracle官方网站有写)。对于开发的时候调试一下&#xff0c;体验一下还是够用的。关键大小比较适中&#xff0c;安装包200多M。…

oracle硬盘亮黄灯,RH2288H V3服务器硬盘亮黄灯故障处理案例

原标题&#xff1a;RH2288H V3服务器硬盘亮黄灯故障处理案例本文广州诚本将分享RH2288H V3服务器硬盘亮黄灯故障处理案例&#xff0c;希望对大家的工作有所帮助。问题描述某客户新开局的项目&#xff0c;采购一批RH2288H V3的服务器&#xff0c;做RAID时发现其中一台服务器一块…

彻底学会IO流

概述&#xff1a; IO流就是用来处理设备间数据传输问题的.常见的应用: 文件复制; 文件上传; 文件下载IO的数据传输&#xff0c;可以看做是一种数据的流动&#xff0c;按照流动的方向&#xff0c;已内存为参照物&#xff0c;进行读写操作IO可以保存到文件&#xff0c;其实就是内…

一些芯片资料

74hc14d u10 u11 u12 六反相触发器 74HC244 三态八缓冲器 u15 u13 uln2003afwg u16 74HC07 u17 L298N 步进电机驱动芯片 MOS管认知 转载于:https://www.cnblogs.com/legion/p/6908434.html

DP Intro - Tree DP Examples

因为上次比赛sb地把一道树形dp当费用流做了&#xff0c;受了点刺激&#xff0c;用一天时间稍微搞一下树形DP&#xff0c;今后再好好搞一下&#xff09; 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意&#xff1a;给你一棵树,让你求最少剪掉多少条边可以剪出一棵点数为m…

转换流/序列化/反序列化

转换流&#xff1a; 使用转换流可以在一定程度上避免乱码&#xff0c;还可以指定输入输出所使用的字符集 InputStreamReader&#xff1a;是从字节流到字符流的桥梁&#xff0c;父类是Reader OutputStreamWriter&#xff1a;是从字符流到字节流的桥梁&#xff0c;父类是Writer 转…

python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)

预期框架整理目标&#xff1a; 1.单个用例维护在单个.py文件中可单个执行&#xff0c;也可批量生成组件批量执行 2.对定位参数&#xff0c;定位方法&#xff0c;业务功能脚本&#xff0c;用例脚本&#xff0c;用例批量执行脚本&#xff0c;常用常量进行分层独立&#xff0c;各自…

vs远程编译linux程序,使用Visual Studio 2015远程调试Linux程序

##安装 Visual Studio 2015安装时注意将跨平台移动开发->Visual C移动开发->Viaual C Android 开发的选项勾上##安装PUTTYVisual Studio依赖putty中的plink来连接Linux机器并发送命令##使用首先在Visual Studio中新建一个空项目这里是列表文本接下来将代码导入到这个空项…

都在说反射,反射到底是什么

概念&#xff1a; 什么是反射? 利用反射可以无视修饰符获取类里面所有的属性和方法对于任何对象&#xff0c;都能够调用它的方法和属性&#xff0c;这种动态获取信息以及动态调用对象方法的功能称为Java的反射 反射的应用场景? 常见的有&#xff1a; idea的智能提示、框架等…

LaunchScreen原理

会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片.可以进入沙盒当中查看,查看方法,找到应用程序根目录.获取方法: NSLog("%",NSHomeDirectory());打印出…

Mac - 苹果电脑mac系统释放硬盘空间方法汇总

硬盘空间是大家最头痛的一个问题&#xff0c;大家在硬盘空间变小的时候怎么腾空间的呢&#xff1f;下面为大家分享7个mac系统释放空间的高级方法&#xff0c;大家赶紧来收了&#xff01; mac系统释放硬盘空间方法&#xff1a; 方法一&#xff1a;删除Emacs——可以节省出60MB的…

XML语言

XML&#xff1a; XML是可扩展的标记语言 标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展&#xff1a;标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 xml学习网站https://www.w3school.com.cn/x.asp 作用&#xf…

xml中的Document和Attribute

1.Document 导入dom4j的步骤 去官网下载 zip 包。http://www.dom4j.org/ 在项目中创建一个文件夹&#xff1a;lib将dom4j-2.1.1.jar文件复制到 lib 文件夹在jar文件上点右键&#xff0c;选择 Add as Library -> 点击OK在类中导包使用 得到Document对象 步骤&#xff1a;…

XPath表达式

什么是XPath XPath&#xff1a;路径表达式 作用&#xff1a;在DOM解析XML时&#xff0c;通过XPath表达让解析更加简单 XPath表达式分类 绝对路径相对路径全文搜索属性查找 什么是Node对象 DOM树中的每个节点就是Node dom4j中与XPath相关的方法 注&#xff1a;使用XPat…

最详细MySQL的安装与介绍Windows

数据库的安装&#xff1a; 打开下载的mysql安装⽂件双击解压缩&#xff0c;运⾏“mysql-5.5.40-win32.msi”。 选择安装类型&#xff0c;有“Typical&#xff08;默认&#xff09;”、“Complete&#xff08;完全&#xff09;”、“Custom&#xff08;⽤户⾃定义&#xff09;”…