2异常处理_异常是什么?什么是常用类?

第一节 异常

1. 异常的概念

异常(Exception) 即例外,程序没有按自己预想的结果运行出来,出现了非正常情况,即“程序得病了”。怎么让我们写的程序做出合理的处理,不至于崩溃是我们关注的核心。 异常机制就是当程序出现错误,程序如何安全退出的机制。
​ 所谓错误是指该程序运行的过程中发生的一些例外事件(如:除0,数组下标越界,所要读取的文件不存在)。

b37513fa7f030aff750978b9450a6857.png


​ Java异常类是Java提供的用于处理程序中错误的一种机制。设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或发生不可预见的结果。
​ Java程序的执行过程中如出现例外事件,可以生成一个异常类对象,该异常对象封装了例外事件的信息并将被提交给Java运行时系统,这个过程称为抛出( throw )异常
当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。

2. 异常的分类

​ JDK中定义了很多异常类,这些类对应了各种各样可能出现的例外事件。我开着车走在路上,一头猪冲在路中间,我刹车,这叫一个 异常。我开着车在路上,发动机坏了,我停车,这叫错误。系统处于不可恢复的崩溃状态。发动机什么时候坏?我们普通司机能管吗?不能。发动机什么时候坏是汽车厂发动机制造商的事。

399ae34466ccfc73930b8e50222f4e54.png


Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。Error 类层次描述了 Java 运行时系统内部错误和资源耗尽错误。这类错误是我们无法控制的,同时也是非常罕见的错误。所以在编程中,不去处理这类错误。Error 表明系统 JVM 已经处于不可恢复的崩溃状态中。我们不需要管他。 如:写代码时突然断电,或者内存溢出。
Exception:所有异常的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示地声明或捕获。

Runtime Exception

​ Runtime Exception类是 Exception 类的子类,叫做运行时异常,Java 中的所有运行时异常都会直接或者间接地继承自 RuntimeException 类。
​ 这一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性可运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理);我们可以通过程序的健壮性来处理,不推荐使用异常处理机制来处理。例如:

NullPointerException: 当程序访问只有引用没有对象的成员属性或成员方法。怎么处理?

ArithmeticException: 除数为 0ClassCastException:多态时类型转换错误

ArrayIndexOutOfBoundsException: 访问的元素下表超过数组长度

NumberFormatException: 数字格式异常!

CheckException(**需要处理的)

​ Java 中凡是继承自 Exception,而不继承自 RuntimeException 类的异常都是非运行时异常,也叫检查时异常。 如:IOException。 必须要对其进行处理,否则无法通过编译。这类异常的产生不是程序本身的问题,通常由外界因素造成的。 为了预防这些异常产生时,造成程序的中断或得到不正确的结果,Java 要求编写可能产生这类异常的程序代码时,一定要去做异常的处理。

3. 异常处理

1) 异常产生

​ 之所以出现异常,是因为内部抛出了异常对象,这个异常对象的产生分为系统内部产生,或程序员手动抛出异常。

4db88cc1c3717e082c776e7d2f2bc41f.png

2) 异常捕获 try catch finally

对于编译(非运行)时异常( checked exception ),必须要对其进行处理,否则无法通过编译。处理方式有两种:

  • 异常捕获
  • 异常处理
6523107e975fd515a863434bc246477f.png

try代码段包含可能产生例外的代码

try代码段后跟有一个或多个catch代码段

每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法

当异常发生时,程序会中止当前的流程,根据获取异常的类型去执行相应的catch代码段

一个 try 后面可以跟多个 catch,但不管多少个, 最多只会有一个catch 块被执行。

finally段的代码无论是否发生异常都有执行try语句
​ try{…}语句制定了一段代码,该段代码就是一次捕获并处理意外的范围。
​ 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。
​ 如果没有意外产生,所有的catch代码段都被略过不执行。catch语句
​ 在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
​ 在catch中声明的异常对象封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。例如:
getMessage()方法,用来得到有关异常事件的信息
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容finally语句
​ finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其它部分以前,能够对程序的状态作统一的管理。无论try所制定的程序块中是否抛出异常,finally所指定的代码都要被执行。
通常在finally语句中可以进行资源的清除工作,如:
关闭打开的文件
删除临时文件

3) 向外 声明( 抛出) 异常 throws

ec912c185b84bf893ef9f3e740f70eb2.png


​ 在产生异常的方法声明后面写上 throws 某一个 Exception 类型,如 throws Exception,将异常抛出到外面一层去
异常与重写声明
子类声明的异常范围不能超出父类的异常范围

d0ee58c9108a3d0ac51501a240c3d51e.png

4. 使用自定义的异常

1)概念

​ 所谓自定义异常,通常就是定义一个类,去继承 Exception 类或者它的子类。因为异常必须直接或者间接地继承自 Exception 类。通常情况下,会直接继承自 Exception 类,一般不会继承某个运行时的异常类。

2)步骤

cef722edd741743eba566ba508096f2e.png

使用自定义异常一般有如下步骤
1、 通过继承java.lang.Exception类声明自己的异常类
2、 在方法适当的位置生成自定义异常的实例,并用throw语句抛出
3、 在方法声明部分用throws语句声明该方法可能抛出的异常

第三节 常用类

1. 字符串相关类

1)String
不可变的字符序列
2)StringBuffer
可变字符序列,并且线程安全,但是效率低
3)StringBuilder
可变字符序列,线程 不安全,但是效率高 (一般用他!)

1)String

由于使用特别多,所以有特殊快捷的创建方式通过双引号 "" 直接创建对象

构造方法

6faeb84b552318f51135ba1e7b2e480a.png

常用方法

fd6364e38cccee78cc166157af8ecaf0.png


还有 valueOf()系列,可以将基本类型的数据转为字符串,当然一般不用这么麻烦
字符串分割 split()

2)StringBuffer和StringBuilder

这两个类使用方式类似。一般用于做字符串拼接,删除,替换,反转,截取,插入等。
通过查看源码,认识StringBuffer和StringBuilder的构造方式,以及与String的转换方式

2. 包装类​

JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。包装类均位于java.lang包

5fe48628edcc7acc4fda3be4352d5cfe.png


在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写即可。
对于包装类说,这些类的用途主要包含两种:
a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本类型数据、包装类对象、字符串之间提供转化!)。
包装类和基本类型之间存在自动装箱和自动拆箱操作,所以可以互相方便地切换。

3. 日期类

​ 作为与我们息息相关的日期,在开发中也是很常见的。在程序中,日期的存储也是个数字,是个长整型的数字。0代表1970年1月1日 00:00:00,而我们处于东八区,所以为1970年1月1日 08:00:0 ,往前推,负数表示之前的时间,往后算正数表示之后的时间。
​ 而在日常中,我们表示日期是使用字符串表示,如 1970年1月1日 08:15 、 1970/01/01 08:15 1970-01-01 08:15 等等,因此就涉及到 如何将长整型数与字符串互转的问题,这也是学习的重点。

1) pre8常用日期相关类

36e8e243515401a1ced1adcc100ba89f.png

(1) 当前时间

//当前毫秒数long timeNum =System.currentTimeMillis();System.out.println(timeNum);//当前日期Date nowDate =new Date();System.out.println(date);

(2) Date

//0 时间点  东八区 1970年1月1日 08:00:0 Date date =new Date(0L);System.out.println(date);//指定一个时间Date myDate =new Date(189712329239L);System.out.println(myDate);System.out.println(myDate.getTime()); //获取长整型数字//修改时间myDate.setTime(0L);System.out.println(myDate);

(3) SimpleDateFormat 日期格式化,在日期格式化的过程中,会用到模板,这个在api中有详细说明

6861313b62761d824c7148f8cb232183.png


字符串的表示形式与日期互换,使用日期转换器SimpleDateFormat ,代码如下:

public static void main(String[] args) throws ParseException {    Date myDate2 =new Date(0L);    //字符串的形式    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    //转字符串    String dateStr =dateFormat.format(myDate2);    System.out.println(dateStr);    //转成日期    myDate = dateFormat.parse("2020-02-25 11:16:30"); //这里有异常    System.out.println(myDate.getTime());}

注意parse()存在 的异常ParseException

2) 8日期相关的常用api(1) jdk8的日期类

java8提供了更为简介的,更明了的常用日期类

4e759854e30ef056309d7d406f4e3fe1.png
//今年System.out.println("今年"+Year.now());//6月System.out.println("月份:"+Month.FEBRUARY);//今天不包含时分秒LocalDate today = LocalDate.now();System.out.println("今天:"+today);//此时此刻LocalDateTime now = LocalDateTime.now();System.out.println("现在:"+now);//您的生日LocalDate yourBirthDate = LocalDate.of(1999, Month.JUNE, 15);System.out.println("生日:"+yourBirthDate);//您的学习时间LocalDateTime dateTime = LocalDateTime.of(2020, 2, 25, 12, 30,40);System.out.println("时间:"+dateTime);

(2) jdk8的格式化类

5e131cda77899a77a37453543b4898dc.png
//日期转换器DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//格式化日期字符串LocalDateTime now = LocalDateTime.now();String nowStr = now.format(formatter);  //放入格式器System.out.println(nowStr);String dateStr= "2020-02-25 11:23:04";//转成日期 LocalDateTime date= LocalDateTime.parse(dateStr, formatter);//放入格式器//获取日System.out.println(date.getDayOfMonth());

(3) jdk8的间隔类

java8提供了方便计算的间隔相关的类 ,这部分了解即可。

dae5b514eb4b66141963246684345b8d.png
LocalDate today = LocalDate.now();LocalDate birthDate = LocalDate.of(1999, 3, 15);//时期间隔 年月日Period p = Period.between(birthDate, today);System.out.printf(p.getYears()+"年"+p.getMonths()+"d"+p.getDays()+"日");LocalDate startDate = LocalDate.of(1993, 8, 19);LocalDate endDate = LocalDate.of(1994, Month.JANUARY,16);//期量单位 间隔long between =ChronoUnit.YEARS.between(startDate, endDate);        System.out.println("两年之间的差   : " + between); //0 不是1不满一年不计算在内between =ChronoUnit.MONTHS.between(startDate, endDate);        System.out.println("两月之间的差   : " + between); //4 不是5不满一月不计算在内        //瞬间 Instant inst1 = Instant.now();Instant inst2 = inst1.minus(Duration.ofSeconds(10));System.out.println("毫秒相隔 : " + Duration.between(inst1, inst2).toMillis());System.out.println("秒相隔 : " + Duration.between(inst1, inst2).getSeconds());

4. Math类

​ java.lang.Math 提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为 double 型。

218b5a92863bc113cd960dc250710f8f.png

5.File类

File 代表文件和目录路径名的抽象表示形式
File 类的常见构造方法:public File(String pathname)
​ 以 pathname 为路径创建 File 对象,如果 pathname 是相对路径,则默认的当前路径在系 统属性 user.dir 中存储。 File 的静态属性 separator 存储了当前系统的路径分隔符。
常见的方法

public boolean canRead()      public boolean canWrite()      public boolean exists()       public boolean isDirectory()     public boolean isFile()       public boolean isHidden()      public long lastModified()   public long length()  public String getName()       public String getPath()
代码示例import java.io.File;/**  * 程序  -->文件  需要建立联系   * 抽象为 File 类  *  * 1、文件夹 与文件  抽象-->File   * 2、分割符:  *     路径分隔符:  ; pathSeparator    *  目录分隔符:        /   separator  *  静态常量:1、构建 FileFile(String pathname)  File(File parent, String child)  File(String parent, String child)  */ public class FileDemo01 {  /**   * @param args   */    public static void main(String[] args) {   System.out.println(File.pathSeparator);   System.out.println(File.separator);   //绝对路径 与文件建立联系   File src = new File("E:est03.gif");   src = new File("E:/test/03.gif");   src = new File("E:"+File.separator+"test"+File.separator+"03.gif");      System.out.println(src.exists());      //相对路径   File src2 = new File("E:/test","03.gif");   src2 = new File(new File("E:/test"),"03.gif");   System.out.println(src.exists());  } } 
import java.io.File; import java.io.FilenameFilter; import java.io.IOException;/*   1、创建对象  new File(完整路径)   →绝对路径  new File(上级路径,本名); →相对路径   new File(上级抽象表示形式, 本名)  2、方法 1)区分目录 or 文件isFile() isDirectory() 2)获取路径 名称 getPath() getAbsolutePath() getName()   3)判断文件是否存在 exists()   4)创建文件 createNewFile()   5)创建目录  mkdir() →创建一层,确保父路径存在,如果父路径不存在,不能创建 mkdirs() →父路径不存在,全部创建 6)列表listFiles() 7)删除文件delete()   return !new File(dir,name).isDirectory(); }    });   for(File temp:subFiles){    System.out.println(temp);   }  }  //delete()  src2 = new File(“E:/test”,”03.gif”);  boolean flag2 =src2.delete();   System.out.println(flag2); }} 


通过 File 对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)。

public boolean createNewFile()throws IOException     public boolean delete()  public boolean mkdir()mkdirs()/** *递归打印文件夹  */  public static void printName(File src){       if(null ==src){            return;       }       System.out.println(src.getPath());         if(src.isDirectory()){            for(File sub:src.listFiles()){                 printName(sub);            }      }   }

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

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

相关文章

origin三元相图_扩增子图表解读7三元图:三组差异数量和关系

点击上方蓝色「宏基因组」关注我们!专业干货每日推送!背景介绍(Introduction)宏基因组学宏基因组学目前的主要研究方法包括:16S/ITS/18S扩增子、宏基因组、宏转录组和代谢组,其中以扩增子研究最为广泛。目的意义本系列文章将带领大…

写出python字符串三种常用的函数或方法_python中几种常用字符串函数

1、lower()把所有字符换成小写 2、upper()把所有字符换成大写 3、swapcase()大小写互换 4、title()把每个单词首字母大写,他是以所有英文字母的字符来区别是否为一个单词的,eg:s "a是傻b" s2 s.title() 结果为"A傻B",a和b都变成了大写,因为他是根据英文字…

python app开发模块_Python pytkapp包_程序模块 - PyPI - Python中文网

用于开发应用程序的python包 多文档/单文档界面 利用tkinter库和附加tkinter集 小部件。 查看可用演示: pytkapp/demo/run_ptapoptionsdemo.py-为选项的容器运行gui demo(可用的小部件、规则) pytkapp/demo/run_ptamdidemo.py-运行MDI应用程序…

搭建python_Crawlab准备之python+scrapy环境搭建

阅读文本大概需要3分钟。上篇《分布式爬虫管理平台Crawlab开发搭建》把爬虫的管理后台搭建起来了;捣鼓一番发现要真正爬取数据还有下不少的功夫。这篇看看怎么搭建pythonscrapy环境。0x01:安装Python3下载python安装包,具体版本根据自己的系统…

64测试cpu稳定性_SuperPI-圆周率计算与CPU性能与稳定性测试

Super PI是由东京大学Kanada lab出品的一款专用于检测CPU稳定性的软件,目前最新版本是1.9版,更新于2013年了。Super PI软件通过计算预定的圆周率让CPU高负荷运作,从而达到考验CPU计算的能力与稳定的作用。同时也能计算出圆周率来保存到文本文…

传值类型_java中的“传值”与“传址”问题

“用对象来生成对象”“对象作为参数进行传递”“构造方法中的参数为对象”问题本质上是“传值”与“传址”的问题先说结论:1、基本类型(包括String类)作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝&#xff…

两个苹果手机如何同步数据_同步苹果手机和Windows的提醒事项

作为一个学生党,能买得起苹果手机已经是一件很幸福的事情了,拥有苹果电脑只是一个美好的愿望,所以现在常见的搭配就是苹果手机加Window电脑,这样就有一个问题,就是苹果手机和Windows电脑的提醒事项没有办法同步&#x…

低通滤波器算法实现_控制算法手记自抗扰控制的几点思考

写在前面在谈自己的一些思考之前,放上一本简明的教材(只有133页),对自抗扰控制ADRC (Active disturbance rejection control)的起源、基本思路、结构、发展及应用做了阐述,是很好的入门读物。图1. 自抗扰控制入门书籍如果要达到弄懂&#xff…

添加日志_第五章springboot2.0添加aop日志实现记录请求地址

1. 添加spring-boot-starter-aop包<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-aopartifactId><version>2.0.0.RELEASEversion>dependency>2. 新建WebLogAspect类3. 添加Aspect Component注解…

本机连接opc server有部分数据不刷新_实时数据库PI在企业MES系统中的应用

实时数据库是计算机控制系统和上层生产管理系统数据存储和展示的核心。结合河南天冠燃料乙醇有限公司MES系统应用实例&#xff0c;介绍了实时数据库PI的安装部署&#xff0c;建立信号量集和数据导入&#xff0c;以及客户端接口配置&#xff0c;数据库测试等相关主题。通过基于P…

java 数组赋值_自学JAVA每日记录(10)-欢迎指点欢迎共勉

接上一篇编程练习&#xff1a;编写一个JAVA程序&#xff0c;创建指定长度的 int 型数组&#xff0c;并生成 100 以内随机数为数组中的每个元素赋值&#xff0c;然后输出数组要求&#xff1a;1、 要求通过定义带参带返回值的方法来实现2、 通过参数传入数组的长度&#xff08;例…

java异常处理机制_Java编程中的异常机制

本文旨在以初学者的角度来学习Java异常的知识&#xff0c;尽量简单&#xff0c;一些细枝末节的知识不会讲述&#xff0c;但不影响对知识的掌握。&#xff08;比如try-catch可以嵌套&#xff0c;不太会这么用&#xff09;1.什么是异常我们先举个例子int 在IDE里输入这样一个stat…

数组字典_VBA数组与字典解决方案第34讲:数组的传递

大家好&#xff0c;今日我们继续讲解VBA数组与字典解决方案&#xff0c;今日讲解的是第34讲&#xff1a;数组的传递。在应用数组的时候&#xff0c;我们往往需要要把数组的值由一个数组传递给另外一个数组&#xff0c;就如同变量的传递一样&#xff1a;AB 把B值赋给ACA 把A值赋…

为什么代码正确却没有爬虫的信息_为什么敷面膜没有效果?原来这才是敷面膜的正确步骤...

七夕泥萌都去哪浪了&#xff1f;是不是化个美美的妆&#xff0c;然后出门吃吃吃逛逛逛&#xff1f;说到出门前化妆&#xff0c;很多小仙女会在化妆前敷面膜&#xff0c;让皮肤保持一个好状态&#xff0c;壹知肤护肤研究中心贺老师&#xff08;sunny老师&#xff09;提到其实这是…

合并 多个dataframe_什么是Pandas的DataFrame?

1. 什么是DataFrameDataFrame是一个表格型的数据结构&#xff0c;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔值等&#xff09;。DataFrame既有行索引也有列索引&#xff0c;它可以被看做由series组成的字典&#xff08;共用同一个索…

web td不对齐_珍稀干货!阿里 Web 音视频开发趟坑指南

作者 | 阿里文娱前端技术专家 归影责编 | 夕颜出品 | CSDN(ID:CSDNnews)这不是一篇基于MSE开发Web播放器的入门文章&#xff0c;而是围绕Web播放器开发遇到的常见问题与解决方案&#xff0c;毕竟入门文章常有而趟坑干货不常有。如果您有Web播放开发经验和音视频技术基础&#x…

subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?

redis的基本操作指令就不多说了&#xff0c;今天对redis的进阶操作给大家介绍一下&#xff0c;以及对于jedis和redisTemplate等工具包没有封装的命令我们该如何使用&#xff1f;相信大家读了本篇对redis的整体会有更深的认知。一、Pipelin模式介绍1、redis的通常使用方式大多数…

子窗体 记录选择_如何设计一个简单的Access登录窗体(1)

Access是一个对数据库新手相当友好的软件。Access的窗体功能确实是一种独一无二的前端设计平台&#xff0c;很多常见的人机交互用法&#xff0c;可以用Access的窗体来轻松实现&#xff0c;同时Access的查询和计算功能&#xff0c;也需要窗体的配合才能获得最佳的表达效果。 一、…

网页javascript加载不出_写给初学者的JavaScript异步编程和背后思想

导读&#xff1a;对于接触JavaScript这门编程语言没有多久的本菜鸡而言&#xff0c;在相当长的一段时间内&#xff0c;我都完全无法理解这门语言中的异步编程&#xff0c;不明白什么叫异步编程以及为什么需要异步编程。为什么顺序执行程序就不行了呢&#xff1f;非要使用异步回…

静态网页托管_求职季,教你制作一份精美的在线网页简历,程序员必看!!

引言近期和学弟交流了一下找实习的相关的话题&#xff0c;谈到了简历这块。虽然近期没有找工作的打算&#xff0c;但还是会不定期的更新自己的简历。于是将自己的简历分享了一下&#xff0c;没想到得到了这样的评价&#xff0c;心里还是挺高兴的。简历的形式是一个在线的静态网…