Java异常

Posted 菜菜小谭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java异常相关的知识,希望对你有一定的参考价值。

**********************为什么有finally*************************

package com.chapter10;

//演示发生了异常没捕获的情况
public class TestFinally {

public static void main(String[] args) {

try{
int a = 0;//连接数据库
int result = 10/a;
System.out.println("aaaaa");
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
System.out.println("数组下标越界");
}catch(NullPointerException e){
e.printStackTrace();
System.out.println("除数不能为0");
}catch(ClassCastException e){
e.printStackTrace();
System.out.println("类型转换错误");
}finally{

//无论如何总要被执行 除非系统强制退出
System.out.println("关闭数据库");
}

//报错终止



System.out.println("here");
}

}


程序发生异常后,没有捕获 会报错终止, 这样后面的代码就没有机会执行了(例如关闭数据库的代码)..


这样光申请资源而不释放肯定是有问题的, 所以为了保证某些代码 必须被执行 可以把这些代码 放到
finally代码块中, finally代码块中的代码 无论如何都会执行...


一般finally 中放一些释放资源的代码 例如关闭数据库、关闭io流、关闭socket通道等..

 

关于finally的几个面试题:


try中如果有return 不会立马返回, 先执行finally,如果finally中有return 那么整个方法的返回值取finally中的返回值,


如果finally 中没有return ,那么整个方法的返回值取try中的..

 


*********************try后面必须跟catch 或finally其中一个*************************


package com.chapter10;

//try后面必须跟catch或finally其中之一
public class TestTryPrinciple {

public static void main(String[] args) {


try {
int a = 10;
int b = a/0;
} catch (Exception e) {
System.out.println("算数异常");
e.printStackTrace();
}

}
}

 


try {
int a = 10;
int b = a/0;
} finally{
System.out.println("释放资源的代码");
}

 

*************************************快捷键*************************


选中需要加try...catch的代码块 右键 surround with ---try...catch

 

 

****************************处理检查性异常的第二种方式--使用throws抛出给调用者处理********************

 

1. 使用try...catch明确处理


驾驶员自己修


2. 使用throws 抛出给调用者处理


坐席碰到异常以后 有两种处理方式,如果能处理 使用try..catch明确处理,如果处理不了,使用throws抛给调用者处理(上级),


抛给班长坐席,班长坐席收到这个异常以后,又有两种方式:try..catch 和使用throws继续抛

 

演示代码:

package com.chapter10.handlerCheckedException2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

//演示处理检查性异常的第二种方式
//使用throws抛给调用者处理
public class TestHandleCheckedException2 {

//警察
//main方法中肯定要处理异常,就像警察必须处理异常一样
//如果main方法不做任何处理 继续向上抛出 会抛给JVM(不推荐)
//JVM的默认处理方式: 打印栈轨迹
public static void main(String[] args) throws FileNotFoundException{
TestHandleCheckedException2 test = new TestHandleCheckedException2();

test.laoliu();
}

public void laoliu() throws FileNotFoundException {

manager();

}

public void manager() throws FileNotFoundException {

customerAgentLeader();
}

// 班长坐席
public void customerAgentLeader() throws FileNotFoundException {
customerAgent();
}

public void customerAgent() throws FileNotFoundException {

// 碰到一个异常
FileInputStream fis = new FileInputStream("d:\jidi16\aaa.txt");
}

}


********************************查看API**************************************

public FileInputStream(String name)
throws FileNotFoundException

 

表示该构造函数可能会出现FileNotFoundException异常,并且该方法本身不做处理,抛给调用者处理

使用该类new对象的人需要进行处理或者继续使用throws抛出

 

********************************自定义异常**************************************

如果API提供的异常不够用,需要用户自己自定义异常


需求: 自定义一个 想要换手机的异常

 


throw 产生了一个异常 异常发生了 相当于 10/0

 

演示代码:


package com.chapter10.演示自定义异常;

//自定义的异常类
//1.继承Exception
//2.使用super("异常的具体描述") 初始化异常描述

//用户自己自定义的异常 都是检查性异常
public class WannaChangePhone extends Exception {

private String name;
private String reason;

public WannaChangePhone() {
super("想要换手机");
}

public WannaChangePhone(String name, String reason) {
super("想要换手机");
this.name = name;
this.reason = reason;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getReason() {
return reason;
}

public void setReason(String reason) {
this.reason = reason;
}

}

 


package com.chapter10.演示自定义异常;

//坐席
public class CustomerAgent {


public void getPhone() throws WannaChangePhone{

if(true){

throw new WannaChangePhone("丁泽鹏","买到二手手机");//产生了一个异常

}
}

public static void main(String[] args) {
CustomerAgent ca = new CustomerAgent();

try {
ca.getPhone();
} catch (WannaChangePhone e) {
System.out.println(e.getName() + "因为" + e.getReason() + e.getMessage());
e.printStackTrace();
}
}
}

 


********************************throws和throw的区别**************************************


throws 处理检查性异常的第二种方式: 抛给调用者处理, 调用者收到这个异常以后 又有两种处理方式:
1.使用try..catch明确的处理 2. 使用throws 继续向上抛

 

throw 产生了一个异常 异常发生了 相当于10/0

*****************************异常的若干知识点***************************

1. 当有多个catch块时, 范围大的异常类应该放到后面....

 

instanceof:

引用a instanceof 类b : 如果引用a 引用的是类b或类b子类的对象返回true,否则返回false

 

2. 不要使用Exception获取所有异常,虽然这样写代码简单,但是不能针对不同的异常做不同的处理...区分不开

 


***************************补充重写规则之两小**********************************

1. 子类方法抛出的异常 是 父类方法抛出异常的子类

 






























































































































以上是关于Java异常的主要内容,如果未能解决你的问题,请参考以下文章

面试Java异常面试题

Java异常

java中 方法中抛出异常处理方法

Java - 异常处理

Java的异常处理语法

Java异常结构