当前位置: 首页 > article >正文

Java异常处理

 

throw new RuntimeException ();

异常的2个作用

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

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

异常的捕获

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

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

手动处理异常语法


try {

预测可能出现异常的语句

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

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

}

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

 

看看运行结果

 

异常的抛出

  • 将异常输出在控制台上: 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快速生成)


http://www.kler.cn/a/9339.html

相关文章:

  • (干货)Jenkins使用kubernetes插件连接k8s的认证方式
  • leetcode hot100【LeetCode 114.二叉树展开为链表】java实现
  • 类别变量分析——卡方独立性检验卡方拟合优度检验
  • NoSQL数据库与关系型数据库的主要区别
  • D67【python 接口自动化学习】- python基础之数据库
  • react的创建与书写
  • 【AUTOSAR】【Lin通信】Lin
  • Java实验课的学习笔记(二)类的简单使用
  • 2023年,软件测试行业怎么样?
  • Spark 并行度
  • docker 安装redis
  • 文档流normal flow
  • Redis - 基础数据类型
  • 签约喜讯 | Smartbi携手金域医学共建统一数据运营平台
  • Dart语言操作符?和!的用法
  • 优思学院|《精益思想》读后感
  • Fork分支代码与主干保持同步
  • ( “树” 之 DFS) 104. 二叉树的最大深度 ——【Leetcode每日一题】
  • 详细介绍别人电脑访问到自己电脑运行的项目
  • linux及docker和postgres SQL常用的一些命令整理
  • 托福高频真词List12 // 附托福TPO阅读真题
  • 【C++】继承---上(继承的引入及使用详解、切片赋值和作用域)
  • Elasticsearch+head+Ik中文分词器的安装以及Go操作Elasticsearch
  • 如何选择适合的企业网站建站方案?
  • 【Linux】基础IO
  • 【微信小程序】-- 自定义组件 - 父子组件之间的通信(三十八)