一、异常处理

1.结构

java.lang.Object

  |-----java.lang.Throwable

    |-----java.lang.Error:错误,java程序对此无能为力,不显式处理

    |-----java.lang.Exception:异常,需要进行处理

      |-----RuntimeException:运行时异常,较常见,可以不显式处理

        |-----ArrayIndexOutOfBoundsException/NullPointerException/ArithmeticException/ClassCastException

      |-----非RuntimeException:编译时异常,必须显式处理

2.处理方法——“抓抛模型”

(1)抛throw:当执行代码出现异常时,就在出现异常的代码处生成一个对应的异常类型的对象,并将其抛出(自动抛出/手动抛出),抛出后程序终止运行

(2)抓catch:抓住抛出的异常类的对象,准备对其进行处理

(3)处理方法一:

try{
//可能出现异常的代码
}catch(Exception1 e){
//对Exception1类型的异常的处理方式
  e.getMessage();//获取异常信息
  e.toString();//获取异常的名字加信息
  e.printStackTrace();//打印异常在堆栈中的信息:异常名称+异常信息+异常位置
}catch(Exception2 e){
//对Exception2类型的异常的处理方式
}finally{
//一定要执行的代码
}

注意事项:

A:try内声明的变量相当于局部变量,出了try{}语句就不能被调用

B:finally是可选的

C:多个catch语句时,抛出的异常从上往下匹配catch中的异常类型,满足就执行该catch内的代码,执行完跳过其他catch语句

D:异常处理完毕,其后的代码继续执行。

E:若catch中多个异常类型是包含的关系,必须把子类的catch语句放在父类的上面,否则报错。

F:finally语句的代码无论如何都会执行,除了System.exit(0);,即退出jvm。

(4)处理方法二:在方法的声明处,显式的抛出该异常对象的类型。

public void Test{
public static void main(String[] args) throws FileNotFoundException,IOException{//继续将异常往上抛,交给虚拟机处理
method2();
}
//public static void main(String[] args){//不往上抛了,直接对异常进行处理
// try{
// method2();
// }catch(Exception e){
// System.out,println(e.getMessage());
// }
//} public static method2() throws FileNotFoundException,IOException{//继续往上抛,交给调用者main处理
method1();
} public static method1() throws FileNotFoundException,IOException{//异常往上抛,交给调用者method2处理
FileInputStream fis = new FileInputStream(new File("hello.txt"));
int b;
while((b = fis.read()) != -){
System.out.println((char)b);
}
fis.close();
}
}

A:格式:throws 异常类型

B:当一个方法可能生成某种异常,但不能确定如何处理这种异常,则此方法应显式的声明抛出异常,表明该方法不对该异常进行处理,由该方法的调用者负责处理。

C:异常的对象可以逐层往上抛,直到mian。在抛的过程中,可以通过try-catch-finally进行处理。

3.手动抛出异常:throw+异常对象

A:格式:throw new Exception1(参数);

4.自定义异常

(1)代码:

public class MyException extends RuntimeException{

    static final long serialVersionUID = -70348975766939L;

    public MyException(){

    }

    public MyException(String msg){
super(msg);
}
}

(2)特点:

A:自定义的异常类要继承现有的异常类,如RuntimeException、Exception,让类具有可抛性。

B:提供一个序列号,用于唯一确定一个异常类。

C:提供几个重载的构造器。

5.抛出异常的方法的重写规则

(1)子类重写父类的方法,其抛出的异常类型只能是父类方法的异常类的子类或异常类型一样。

(2)代码:

public class TestOverride{
public static void main(String[] args){
//调用method1时,编译时认为a是A类型的,应该抛出IOException,
//而实际运行时a是B类型的,如果重写的method1抛出异常比父类方法的异常类型大,就会报错
A a = new B();
try{
a.method1();
}catch(IOException e){//
e.printStackTrace();
}
}
} class A{
public void method1() throws IOException{ }
} class B exrends A{
public void method1() throws FileNotFoundException{ }
}

6.题目:下面代码的输出结果。

public Test{
static void methodA(){
try{
System.out.println("进入方法A");
throw new RuntimeException("手动制造异常");
}finally{
System.out.println("方法A的finally");
}
} static int methodB(){
try{
System.out.println("进入方法B");
return ;//有finally不能return
}finally{
System.out.println("方法B的finally");
return ;
}
} public static void main(String[] args){
try{
methodA();
}catch(Exception e){
System.out.println(e.getMessage());
}
int i = methodB();//上面异常处理完,接着执行methodB
     System.out.println(i);//输出2
}
}

结果:

进入方法A

方法A的finally

手动制造异常

进入方法B

方法B的finally

2

Java语法基础学习DayEight的更多相关文章

  1. Java语法基础学习DayEighteen(常用类)

    一.String类 1.特点 String代表不可变的字符序列,底层用char[]存放. String是final的. 2.内存解析 3.常用方法 int length() char charAt(i ...

  2. Java语法基础学习DaySeven

    ---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean          byte——Byte ...

  3. Java语法基础学习DaySix

    一.JavaBean——可重用组件 1.JavaBean是指符合以下标准的Java类: (1)类是公共的 (2)有一个无参的公共的构造器 (3)有属性,且有对应的get.set方法 2.好处 用户可以 ...

  4. Java语法基础学习DayThree

    一.流程控制语句补充 1.switch语句 格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ... default: 语句体 ...

  5. Java语法基础学习DayTwentyOne(网络编程)

    一.IP地址和端口号 1.作用 通过IP地址,唯一的定位互联网上一台主机. 端口号标识正在计算机上运行的进程,不同进程有不同的端口号,被规定为一个16位的整数0~65535,其中0~1023被预先定义 ...

  6. Java语法基础学习DayTwenty(反射机制续)

    一.Java动态代理 1.代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上. 2. ...

  7. Java语法基础学习DayNineteen(反射机制)

    一.Refection定义 1.概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  8. Java语法基础学习DaySeventeen(多线程续)

    一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...

  9. Java语法基础学习DaySixteen(多线程)

    一.多线程的创建 1.作用 程序需要同时执行两个或多个任务时需要多线程. 程序需要实现需要等待的任务时,如用户输入.文件读写操作.网络操作.搜索等,需要多线程. 需要一些后台运行的程序时,需要多线程. ...

随机推荐

  1. css之transform属性

    定义元素的旋转(rotate),缩放(scale),移动(translate),倾斜(skew) rotate rotate(angle) 定义 2D 旋转,在参数中规定角度. rotate3d(x, ...

  2. implode

    $names = implode('|', array_column($categoryBackNameArr, 'name'));

  3. 路由器固定IP配置

    前言 路由器插入好电源,插入好网线,笔记本连接路由器的wifi,连接成功后,网页自动打开. 1.在网页自动输入管理员密码 2.上网方式选择固定IP地址,输入IP地址,子网掩码,默认网关,DNS服务 3 ...

  4. css 选择器二

    2.4 盒模型 2.4.1 定义 在CSS中,"box model"这一术语是用来设计和布局时使用,然后在网页中基本上都会显示一些方方正正的盒子.我们称为这种盒子叫盒模型. 盒模型 ...

  5. hadoopMR自定义输入格式

    输入格式 1.输入分片与记录  2.文件输入  3.文本输入  4.二进制输入  5.多文件输入  6.数据库格式输入 详细的介绍:https://blog.csdn.net/py_123456/ar ...

  6. python-mongodb基本操作都在这了

    数据库 增 use db1 #有则切换,无则新增 查 show dbs #查看所有 db #当前 删 db.dropDatabase() 集合: 增: db.user db.user.info db. ...

  7. python-爬虫-Beautifulsoup模块

    一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  8. NPM 使用及npm升级中问题解决

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  9. 接口测试--postman简介

    一.什么是接口测试 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑 ...

  10. Hexo+Github 搭建属于自己的博客(Mac下安装 其他操作系统大同小异)

    安装前提 参考博客:http://blog.csdn.net/gdutxiaoxu/article/details/53576018#t5(写的很好,不用看我的了.....) 这篇:http://ww ...