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. 基于Docker搭建大数据集群(四)Spark部署

    主要内容 spark部署 前提 zookeeper正常使用 JAVA_HOME环境变量 HADOOP_HOME环境变量 安装包 微云下载 | tar包目录下 Spark2.4.4 一.环境准备 上传到 ...

  2. Kurskal算法

    Kruskal算法是以边为主要关注对象的最小生成树算法,是最小生成树最佳的算法实现. 其时间复杂度为O(ElogE)(E为边的数量),而Prime算法采用邻接矩阵的方法是O(V^2)(V为顶点数量). ...

  3. SpringCloud实现服务间调用(RestTemplate方式)

    上一篇文章<SpringCloud搭建注册中心与服务注册>介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者调用服务提供者的过程. 本文目录 一.服务调用流程二.服务提供者三.服务消 ...

  4. (java实现)单链表

    什么是单链表 在了解单链表之前,你知道什么是链表吗?如果你不知道什么是链表,可以看看我的这篇博客<链表-LinkList> 单链表是链表的其中一种基本结构.一个最简单的结点结构如图所示,它 ...

  5. Spring MVC-从零开始-@RequestMapping 注解value属性

    1.@RequestMapping 注解可以在控制器类的级别和/或其中的方法的级别上使用. 2.直接在方法上使用@RequestMapping package com.jt; import org.s ...

  6. JavaScript总结(一)

    一.JavaScript 简介 1.1 .什么是 JavaScript? JavaScript 的简称:JS. JavaScript 是一个脚本.(不需要经过编译器编译的语言就叫做脚本) JavaSc ...

  7. 如何解决myeclipse2014突然无法打开的问题

    今天突然发现我的myeclipse2014打开不了,昨晚还好好的,上网找了一下没有找到解决方法,于是新建一个工作区间Workspace Test,再打开File->Switch WorkSpac ...

  8. Stanford公开课《编译原理》学习笔记(2)递归下降法

    目录 一. Parse阶段 CFG Recursive Descent(递归下降遍历) 二. 递归下降遍历 2.1 预备知识 2.2 多行语句的处理思路 2.3 简易的文法定义 2.4 文法产生式的代 ...

  9. sort,uniq,wc,tr

    sort (选项)(参数)      sort是用来排序数据的. 以下面这个文本为例 [root@bogon ~]# cat a 123 4567 88 abc aaa AAA jk 777 777 ...

  10. 一文了解 Redis 内存监控和内存消耗

    Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis ...