Java基础(十五)异常(Exception)
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)的更多相关文章
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- Java实习生常规技术面试题每日十题Java基础(五)
目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...
- “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十五章:Unicode与转义字符
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Bootstrap<基础十五> 输入框组
Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- Java基础十--接口
Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...
- Java基础13一异常
1.异常概念 异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程. 设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果. Ja ...
- Java基础学习补充 -- 异常处理和log4j日志
Java中的异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. Java中所有异常的基类Throwable:Throwable又分为Error类和Excepti ...
随机推荐
- ubuntu linux重置密码
(和网上的有点不一样,记录一下) 1)重启系统,同时长时间按住shift键进入grub菜单:GNU GRUB version 1.99-12ubuntu5(如图一) 2)选择Ubuntu, with ...
- 【Python笔记】Python 基础语法
Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小 ...
- Spring 梳理 - JavaConfig、SPI、SCI、SpringSCI、WebApplicationInitializer、AbstractAnnotationConfigDispatcherServletInitializer、WebMvcConfigurationSupport
总结1: SCI:Servlet容器(Tomcat)提供的初始化Servlet容器本身的接口,可替换web.xml SpringSCI:SpringServletContainerInitialize ...
- Fresco添加HTTP请求头
项目中用Fresco来管理图片由于服务器图片有不同的版本需要根据客户端的屏幕密度来选择不同的图片共享一份用OkHttp下载图片并添加HTTP头代码. public class OkHttpNetwor ...
- Spring GetBean流程
第一节讲解Spring启动的时候说到,Spring内部先解析了所有的配置,加载所有的Bean定义后,再根据需要对Bean进行实例化和初始化.除开Spring自己主动新建的对象,第一次根据Bean定义 ...
- ORM增删改查
目录 orm django 连接mysql顺序 1 settings配置文件中 2 项目文件夹下的init文件中写上下面内容, 补充 3 models文件中创建一个类(类名就是表名) 4.执行数据库同 ...
- mysql root密码忘记
首先停掉mysql服务,在/etc/my.cnf中添加 skip-grant-tables,同时可以添加skip-networking选项来禁用网络功能,防止这时其他人通过网络连接到数据库 [mysq ...
- linux无法安装应用
需安装flex 和bison 一般需要更新软件源 root权限 下 apt-get update apt-get upgrade 如果出现以下问题,先查看网络是否畅通: ping 192.168.0. ...
- SpringBoot使用thymeleaf模板引擎引起的模板视图解析错误
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as ...
- 超链接target属性的取值和作用?
<a>标签的target属性规定在何处打开连接文档 属性值 _black:点击一次打开一个新窗口 _new:始终在同一个新窗口中打开 _self:默认,在当前窗口打开 _parent:在父 ...