1.处理错误的要求

  如果由于出现错误而使得某些操作没有完成,程序应该:

  • 返回到一种安全状态,并能够让用户执行一些其他的命令。
  • 允许用户保存所有操作的结果,并以妥善的方式终止程序。

  

  2.程序中可能出现的错误和问题

  • 用户输入错误
  • 设备错误
  • 物理限制
  • 代码错误

  

  3.异常分类

  

  Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。

  RuntimeException类是由程序错误导致的异常,包括错误的类型访问、数组访问越界和访问空指针。

  IOException类是由I/O错误导致的异常。

  将派生于Error类或RuntimeException类的所有异常称为非受查异常(unchecked),所有其他异常称为受查(checked)异常。

  

  4.抛出异常

  一个方法不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。例如,读取文件的代码应该考虑到文件不存在或者内容为空,因此需要抛出IOException异常。方法应该在其首部声明所有可能抛出的异常。

  (1)需要抛出异常的4种情况:

  • 调用一个抛出受查异常的方法,例如,FileInputStream构造器
  • 程序运行中发现错误,并且利用throw语句抛出一个受查异常
  • 程序出现错误。例如,a[-1]会抛出一个ArrayIndexOutOfBoundsException非受查异常
  • Java虚拟机和运行库时出现的内部错误。

  (2)对于一个已经存在的异常类,将其抛出的步骤为

  • 找到一个合适的异常类
  • 创建这个类的一个对象
  • 将对象抛出
String readData(Scanner in) throws EOFException{
...
while(...){
if(!in.hasNext())
if(n<len)
throw new EOFException();
}
}
return s;
}

  5.创建异常类

  如果任何标准异常类都没有能够充分地描述清楚的问题,那么就应该创建自己的异常类。

  只需要创建一个extends于Exception类或者Exception类的子类即可,这个定义的类应该包含两个构造器,一个是默认的构造器,一个是带有详细描述信息的构造器。然后将在需要抛出异常时创建这个定义的类的对象并抛出即可。

  

  6.捕获异常

  若某个方法抛出异常,既可以在当前方法中进行捕获,然后处理该异常,也可以将异常向上抛出,由方法调用者来处理。

  捕获异常和传递异常的选择:应该捕获那些知道如何处理的异常,而将那些不知道如何处理的异常继续进行传递。

  将异常直接交给能够胜任的处理器进行处理要比压制对它的处理更好。

  如果在try语句块中的任何代码抛出了一个在catch字句中说明的异常类,那么

  • 程序将跳过try语句块的其余代码
  • 程序将执行catch字句中的处理器代码

  如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch子句。

  在有多个catch语句块时,用来捕获子类的catch语句要放在捕获父类的catch语句的前面。

  7.代码示例

  (1)try...catch语句块捕获异常

public static int parseInt(String s) throws NumberFormatException{…} 

try{
int age=Integer.parseInt("24L"); //抛出NumberFormatException异常
System.out.println("打印1");
}catch(NumberFormatException e){ //捕获NumberFormatException异常
System.out.println("年龄请输入整数!");
System.out.println("错误:"+e.getMessage());
}
System.out.println("打印2");

  (2)使用throws关键字抛出异常

  dofile方法声明抛出了一个IOException异常,那么该方法的调用者main()方法中需要捕获该异常并进行处理。

  (举个栗子)如果main()方法不想使用try...catch捕获异常,可以同样使用throws向上抛,然后main()方法的调用者捕获异常并处理,...可以一直向上抛,但最终要有能够处理该异常的代码。

  如果异常类型是Error、RuntimeException或它们的子类,可以不使用throws来声明要抛出的异常,因为Java虚拟机会捕获此类异常。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo {
public static void main(String[] args){
try{
dofile("C:/mytxt.txt");
}catch(IOException e){
System.out.println("调用dofile()方法出错!");
System.out.println("错误:"+e.getMessage());
}
}
public static void dofile(String name) throws IOException{
File file=new File(name); //创建文件
FileWriter fileOut=new FileWriter(file);
fileOut.write("Hello!world!"); //向文件中写入数据
fileOut.close(); //关闭输出流
fileOut.write("爱护地球!"); //运行出错,抛出异常
}
}

  (3)使用throw关键字抛出异常

  throw用于方法内,并且抛出一个异常类的对象,而throws用在方法声明中,来指明方法可能抛出的多个异常。

  通过throw抛出异常后,如果想由上一级代码捕获并处理,则同样需要使用throws关键字在方法的声明中指明要抛出的异常类。其他和throws抛出异常一致。

public class People {
public static int check(String strage) throws Exception{
int age=Integer.parseInt(strage); //转换字符串为int型
if(age<0) //如果age小于0
throw new Exception("年龄不能为负数!"); //抛出一个Exception异常对象
return age;
}
public static void main(String[] args) {
try{
int myage=check("-101"); //调用check()方法
System.out.println(myage);
}catch(Exception e){ //捕获Exception异常
System.out.println("数据逻辑错误!");
System.out.println("原因:"+e.getMessage());
}
}
}

  (4)自定义异常类

  创建自定义异常,必须继承Exception类,同时包含两个方法

public class MyException extends Exception {            //继承Exception类
private String content;
public MyException(String content){ //构造方法
this.content=content;
}
public String getContent() { //获取描述信息
return this.content;
}
}

  使用throw抛出自定义异常类对象

public class Example {
public static void check(String str) throws MyException{ //指明要抛出的异常
char a[]=str.toCharArray(); //将字符串转换为字符数组
int i=a.length;
for(int k=0;k<i-1;k++){ //检查字符数组中的每个元素
//如果当前元素是英文字母以外的字符
if(!((a[k]>=65&&a[k]<=90)||(a[k]>=97&&a[k]<=122))){
//抛出MyException异常类对象
throw new MyException("字符串\""+str+"\"中含有非法字符!");
}
}
}
public static void main(String[] args) {
String str1="HellWorld";
String str2="Hell!MR!";
try{
check(str1); //调用check()方法
check(str2); //执行该行代码时,抛出异常
}catch(MyException e){ //捕获MyException异常
System.out.println(e.getContent()); //输出异常描述信息
}
}
}

  5.不需要通过“try...catch”、“throws”捕获或者抛出的不受查异常(Unchecked Exception)RuntimeException异常

  

  (6)必须通过“try...catch”、“throws”捕获或者抛出,否则就会编译出错的受查异常(Checked Exception)

  

  

Java基础(十五)异常(Exception)的更多相关文章

  1. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的

    本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...

  2. Java实习生常规技术面试题每日十题Java基础(五)

    目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...

  3. “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. “全栈2019”Java第十五章:Unicode与转义字符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  7. Java基础十二--多态是成员的特点

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  8. Java基础十--接口

    Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...

  9. Java基础13一异常

    1.异常概念 异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程. 设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果. Ja ...

  10. Java基础学习补充 -- 异常处理和log4j日志

    Java中的异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. Java中所有异常的基类Throwable:Throwable又分为Error类和Excepti ...

随机推荐

  1. selenium-03-02操作元素-等待

    1.最直接普通的方式:这个是设置固定的等待时间    Thread.sleep(1000);   2.隐式等待方式(implicitlyWait):设置脚本在查找元素时的最大等待时间:    driv ...

  2. 网关鉴权后下游统一filter获取用户信息

    1. 场景描述 最近有点忙,在弄微服务nacos+springcloud gateway这块工作,以前只是简单应用,这次因为要对接10几个系统或者平台,还的鉴权,等后续稍微闲点了,把这块东西总结下. ...

  3. Spring 梳理-bean配置与装配

    1       bean配置与装配 1.1      bean在XML文件中进行显示配置并装配 1.2      bean在JavaConfig中显示配置并装配 1.2.1  优点:类型是安全的,编译 ...

  4. python使用代理ip

    python使用代理的方法有两种 1. #先创建代理ip对象 proxy_support = urllib.request.ProxyHandler({'https':'117.64.149.137: ...

  5. Flume 知识点(六)Flume 的监控

    简述 使用 Flume 实时收集日志的过程中,尽管有事务机制保证数据不丢失,但仍然需要时刻关注 Source.Channel.Sink 之间的消息传输是否正常. 比如,SouceChannel 传输了 ...

  6. ELK 学习笔记之 elasticsearch elasticsearch.yml配置概述

    elasticsearch.yml配置概述: 设置集群名字 cluster.name 定义节点名称 node.name 节点作为master,但是不负责存储数据,只是协调. node.master: ...

  7. 想转行做程序员,是学习JAVA还是Python?哪个更好?

    请大家务必审题,转行做程序员,是程序员,并非数据分析也不是软件测试. 首先声明:这是一篇容易引起撕逼的问答,为了祖国和谐,人民安康,请各位看官尽量理性讨论. 同时,这篇文章是面向一些初入行的朋友进行一 ...

  8. centos7编译安装LNMP(nginx-1.16.0,mysql8.0.16,php-7.3.6)常见问题报错及解决方法

    LNMP的安装与配置 nginx-1.16.0安装及配置: 第一步:前往官网下载nignx源码包 下载完毕后上传至服务器(先安装lrzsz) yum -y install lrzsz 安装完毕后执行: ...

  9. aapt dump报错dump failed because no AndroidManifest.xml found解决方式

    路径太长, 方法1:把apk放到短路径文件夹 方法2::先cd /D xxxx 再执行 aapt dump badging xxx.apk

  10. (19)ASP.NET Core EF创建模型(包含属性和排除属性、主键、生成的值)

    1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方法,这两种方法 ...