Java异常处理

 Java异常处理_第1张图片

Java异常处理_第2张图片

throw new RuntimeException ();

异常的2个作用

1.异常用来查询bug的关键参考信息

2. 异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

异常的捕获

当程序JVM默认处理异常时,遇到异常会爆红,无法继续执行下去

但是当我们手动处理时,可以让异常的语句后面的程序任然能执行

手动处理异常语法


try {

预测可能出现异常的语句

}catch(异常类名 随便一个变量名){

当语句异常与预测v的异常类名一致时,运行该花括号里的语句

}

下面的代码演示了手动处理异常的情况

Java异常处理_第3张图片

 

看看运行结果

Java异常处理_第4张图片

 Java异常处理_第5张图片

异常的抛出

  • 将异常输出在控制台上: throw new 异常类名();
  •  在方法名后面加上throws 异常类名1,异常类名2

对于第二种抛出:编译时类型必须要写,运行时类型可以不写

public class Throw {
    public static void main(String[] args) {
        int [] a = {0};
        int m = 0;
        try {
            m = max(a);
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引越界异常");
        }
        System.out.println(m);
    }

    static  int max(int arr[]){
        int maxn = arr[0];

        if(arr.length==1)
        {
            throw new ArithmeticException();
        }
        if(arr==null){
            throw new NullPointerException();
        }
        for (int i : arr) {
            if(i>maxn)
                maxn = i;

        }
return maxn;
    }
}

异常小结

抛出:告诉调用者出错了,一半用在方法里面

捕获:为了让程序继续运行下去,一半用在调用方法时

测试

package exception;

public class Girlfrend {
    int age;
    String name;

    public Girlfrend() {
    }

    public Girlfrend(int age, String name) {
        this.age = age;
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        if(age<18||age>40)
            throw new RuntimeException();
    this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {

        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        if(name.length()>10)
            throw new RuntimeException();
        this.name = name;
    }

    public String toString() {
        return "Girlfrend{age = " + age + ", name = " + name + "}";
    }
}
package exception;

import java.util.Scanner;
//键盘录入女朋友姓名和年龄
//姓名长度在3-10之间
//年龄范围是18-40
//如果超出这个范围就需要重新录入,直到录到正确为止

//需要考虑用户在键盘录入时的所有情况
//如:录入年龄时超出范围,录入年龄时录入abc等情况
public class Test {
    public static void main(String[] args) {
        //创建键盘录入的对象
        Scanner sc = new Scanner(System.in);
        //创建女朋友的对象
        Girlfrend gf = new Girlfrend();
        while (true) {
            try {
                //接受女朋友的姓名
                System.out.println("输入女朋友的名字");
                String name = sc.nextLine();
                gf.setName(name);

                //接收女朋友的年龄
                System.out.println("请输入女朋友年龄");
                //因为年龄是int类型,而这输入的是字符,需要用包装类转换
                String ages = sc.nextLine();
                int age = Integer.parseInt(ages);
                gf.setAge(age);
                //如果进行到这了就说明没有异常,那么就退出循环
                break;
            } catch (NumberFormatException e) {
                System.out.println("请重新输入姓名");
            }
            catch (RuntimeException e) {
                System.out.println("请重新输入年龄或者姓名");
            }
        }
        //打印
        System.out.println(gf);
    }
}

在set方法里面判断输入的信息是否有问题,若没问题就将信息录入,如果有问题就抛出异常,在调用时捕获该异常

在循环中,如果有异常就继续循环,直到输入的信息完全没问题。

自定义异常类

  1. 定义一个类,继承RuntimeException(当异常类型属于运行时类型时),或者继承Exception(当异常类型属于编译时类型时)。
  2. 然后在类里面写2构造器,一个有参一个无参,(直接Alt+ins快速生成)

你可能感兴趣的:(servlet)