我们在程序运行的过程中出现错误时很正常的,出错,我们的代码执行就会停止,那么我们可以使用异常处理来帮助程序员检查可能出现的问题。
1.java中异常的分类,分为:java.lang.Error和java.lang.Exception,java.lang.Throwable类是两种的父类。
2.java异常处理机制。
2.1捕获异常
2.2声明抛出异常
3.异常处理
异常处理共涉及五个关键字:try,catch,throw,throws,finally。
自行处理:可能引发异常的语句封装在try在,而处理异常的语句在catch内。
抛出异常:在方法声明中包括throws子句,通知调用者,如果发生了异常,必须有调用者处理。
异常的例子:
package com.dh.ch06;
/**
* 测试异常的发生
*/
public class ExceptionDemo {
public static void main(String[] args) {
// 0做除数
int i = 12 / 0;
System.out.println("结果是:" + i);
}
}
很明显会发生异常:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.dh.ch06.ExceptionDemo.main(ExceptionDemo.java:8)
try catch例子:
package com.dh.ch06;
public class TryCatchDemo {
public static void main(String[] args) {
//定义一个String变量,值为null
String str = null;
try {
if (str.equals("hello")) {
System.out.println("hello java");
}
} catch (NullPointerException e) {
System.out.println("空指针异常");
}
}
}
空指针异常
多重catch异常处理例子:
package com.dh.ch06;
import java.util.Scanner;
/**
* 多重catch的使用方法
*/
class MoreCatchDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a[] = new int[2];
try {
// 从键盘获取一个字符串
String str = scanner.next();
// 将字符串转换成整数(会引发NumberFormatException)
int num1 = Integer.parseInt(str);
// 从键盘获取一个整数
int num2 = scanner.nextInt();
// 将两个数相除(会引发Exception),并赋值给a[1]
a[1] = num1 / num2;
// 给a[2]赋值(引发ArrayIndexOutOfBoundsException)
a[2] = num1 * num2;
System.out.println("OK!");
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("数组越界异常!");
} catch (NumberFormatException ex) {
System.out.println("数字转换异常!");
} catch (Exception ex) {
System.out.println("其他异常!");
}
}
}
你输入的内容不同会引发不一样的异常。
当一个catch语句捕获到异常的的时候,后面的catch是不会再执行的。捕获异常的顺序和catch语句的顺序有有关,所以我们在安排catch语句的时候要先安排特殊的异常,然后是一些普通的异常。
嵌套异常处理:
在使用嵌套的try块时,将先执行内部的try,如果没有遇到匹配的catch快,则将检查外部的try catch。
package com.dh.ch06;
import java.util.Scanner;
/**
* 嵌套try-catch的使用
*/
public class NestedExceptionDemo {
public static void main(String[] args) {
try {
try {
Scanner scanner = new Scanner(System.in);
// 从控制台中传入两个参数
int number1 = Integer.parseInt(scanner.next());
int number2 = Integer.parseInt(scanner.next());
// 求商运算
double result = number1 / number2;
System.out.println("the result is " + result);
} catch (NumberFormatException e) {
System.out.println("数字格式转换异常!");
}
} catch (ArithmeticException e) {
System.out.println("0做除数无意义!");
}
}
}
finally,在某些特定的情况下,不管是否有异常,都要执行一些语句,比如数据库连接时,不管对数据库的操作是否成功,最后都需要关闭数据库。
package com.dh.ch06;
/**
* try-catch-finally的使用,模拟数据的操作
*/
public class FinallyDemo {
public static void main(String[] args) {
System.out.println("请打开数据库连接......");
try {
System.out.println("执行查询操作");
System.out.println("执行修改操作");
// 使用0做除数
int i = 12 / 0;
System.out.println("结果是:" + i);
} catch (Exception ex) {
System.out.println("除零出错!");
} finally {
System.out.println("请关闭数据库连接......");
}
}
}
4。自定义异常:
自定义异常只需创建一个类继承Execption即可,
在程序中使用自定义的异常,可以分为这几个步骤:
(1):创建自定义异常类
(2):在方法中通过throw关键字抛出异常对象
(3)如果在当前抛出异常的方法中处理异常,可以使用try——catch语句块来捕获并处理,否则在方法中生声明throws关键字指明要抛给的调用者的异常。
(4):在出现异常的方法调用者中处理异常。
例子:
package com.dh.ch06;
public class MyExecption extends Exception{
public MyExecption(String ErrorMessage){
super(ErrorMessage);
}
}
/**
*
*/
package com.dh.ch06;
import java.nio.charset.MalformedInputException;
public class Tran {
public static int vag(int a,int b) throws MyExecption{
if(a<0 || b<0){
throw new MyExecption("不可以为负数");
}
if(a>100 || b>100){
throw new MyExecption("不能大于100");
}
return a+b;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
int result = vag(100,120);
System.out.println(result);
}catch(MyExecption e)
{
System.out.println(e.getMessage());
}
}
}
5.在方法中抛出异常:
throws关键字主要在声明方法的时候抛出异常,多个异常可以用逗号隔开。
例子:
package com.dh.ch06;
public class Shoot {
public static void pop()throws NegativeArraySizeException {
int a[] = new int[-3];
}
public static void main(String[] args){
// TODO Auto-generated method stub
try{
pop();
}catch(NegativeArraySizeException e){
System.out.println("pop方法出错");
}
}
}
下一篇是集合与泛型