应用案例
package test0810;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
/*
* 将有可能产生异常的代码,放在try块中.
* 一旦发生了异常,Java会自动创建一个异常对象,并把它抛出.
* try块就可以捕获这个异常对象.但是try块不能处理异常
* catch可以处理异常,所以try块捕获的异常会交给catch块处理.
*/
try {
int num = input.nextInt();
System.out.println(num);
int a = 10/num;
String str = null;
//str.length(); -空指针
int[] arr = new int[5];
arr[5] = 10;
} catch (ArithmeticException e) {//数学异常
e.printStackTrace();// 异常堆栈
}catch (InputMismatchException e) {//输入异常
e.printStackTrace();// 异常堆栈
}catch (NullPointerException e) {//空指针异常
e.printStackTrace();// 异常堆栈
}catch (ArrayIndexOutOfBoundsException e) {//数组越界异常
e.printStackTrace();// 异常堆栈
}catch (Exception e) {//异常类的父类--多态
e.printStackTrace();// 异常堆栈
}
System.out.println("程序正常结束!");
}
}
检查性异常和非检查性异常
package test0810;
import java.io.FileReader;
public class Test01 {
public static void main(String[] args) {
try{
//运行时异常(RunTimeException)运行时才会发生的异常,不会做语法检查
String str = null;
str.length();
//非运行时异常,会检查语法错误,会强制你去做异常处理
FileReader in = new FileReader("d:/a.txt");
}catch(Exception e){
e.printStackTrace();
}
}
}
应用过程描述
package test0810;
public class Test02 {
public static void main(String[] args) {
//try-catch结构仅仅是能够处理异常
try{
//Java连接mysql
//加载驱动
//创建连接,需要耗费资源
//发生sql语句,做增删改查
}catch(Exception e){
e.printStackTrace();
}finally{
//不管是否发生异常,finally块始终执行.
//善后处理:关闭连接,释放资源
}
}
}
注意事项
package test0810;
public class Test04 {
public static void main(String[] args) {
/**
* 1.try块不可以单独存在,后面可以跟catch
* 2.catch块不可以单独存在
* 3.finally块也不可以单独存在
* 4.但是,try块后可以直接跟finally,catch块可以不存在
*/
try{
}finally{
}
}
}
throw(动词) 和 throws(名词)
package test0810;
public class Test05 {
private int age;
/*
public void setAge(int age) {
if (age > 140 && age < 0) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
} else {
this.age = age;
}
}
*/
public void setAge(int age) throws Exception {//声明异常
if (age > 140 || age < 0) {
throw new Exception("年龄不合法!");
}else{
this.age = age;
}
}
public int getAge(){
return age;
}
public static void main(String[] args) throws Exception {
// throw(动词) 和 throws(名词)
// throw:主动抛出一个异常
Test05 t = new Test05();
t.setAge(-20);
System.out.println(t.getAge());
}
}
异常继承树
常见异常类型
【总结与提示】
- catch子句的捕获范围,限制于与其匹配的try子句,不能捕获其他try子句中的异常;
- 不能单独使用try子句,它必须和catch子句或finally子句结合使用,catch子句可以设置多个,
finally子句只能有一个; - 有多重catch子句时,只能执行那个捕获到异常的子句,其余的catch子句不能执行;
- try/catch/finally三个子句中变量的作用域独立而不能相互访问。如果要在三个子句中都可以访
问,则需要将变量定义到这些子句的外面; - 不要写过大的try子句,一个try子句中尽量不要存在太多的异常;
- 一个方法中如果有发生异常的可能,则可以进行捕获处理,也可以声明由调用者来处理;
- throw语句后不允许有其他语句,因为这些语句没有机会执行;
- 不能利用异常处理来进行程序的分支处理,它只是处理非正常情况的一种机制。