首页 > 编程语言 >Java基础之异常

Java基础之异常

时间:2024-07-21 14:55:41浏览次数:19  
标签:Java String void 基础 System method 异常 public

异常

1.概述

​ 代码出现了不正常的现象,在Java中每一个异常都是java一个一个的类,或者叫做异常对象

2.异常体系说明

Throwable:

  • Error:错误

    • 类似于人得了癌症,不能通过处理让代码变正常,必须得重新写
  • Exception:异常(所有异常的父类)

    • 类似于人得了感冒可以治疗,可以通过处理让代码变得正常

分类:

  • 编译时期异常:代码一写,jvm编译,冒红(Exception以及Exception的子类 除了RuntimeExcption以及RuntiomeException的子类)
  • 运行时期异常:代码写的时候没事,但是运行就报错(RuntimeException以及子类)
public class Demo01 {
    public static void main(String[] args) {
        int[] data = new int[3];
        System.out.println(data[3]);
    }
}

在这里插入图片描述

/*编译时期异常-> 
  不是写的语法错误,
  而是底层给我们抛了一个编译时期异常对象,底层抛出的异常继承自Exception
  我们一用就出现了编译时期异常*/
public class Demo02 {
    public static void main(String[] args) {
        FileOutputStream fos = new FileOutputStream("day11_exception\\1.txt");
    }
}

3.异常出现的过程

在这里插入图片描述

4.创建异常对象

格式

throw new 异常对象()
public class Demo04 {
    public static void main(String[] args) {
        String s = "abc.txt1";
        method(s);
    }

    public static void method(String s) {
        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new NullPointerException();
        }
    }
}

5.异常处理方式

5.1异常处理方式(throws)

​ 在参数后面throws 异常(一个)

public class Demo05 {
    public static void main(String[] args)throws FileNotFoundException {
        String s = "abc.txt1";
        /*
          method方法使用了throws异常处理方案
          往上抛异常,但是抛的是编译时期异常
          此异常让调用处接收了
          也就是说:method(s)接收了一个下面抛过来的编译时期异常
          所以此处爆红
         */
        method(s);

        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    public static void method(String s)throws FileNotFoundException {
        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new FileNotFoundException();
        }
        System.out.println("我要执行");
    }
}

​ 在参数后面throws 异常1,异常2

public class Demo06 {
    public static void main(String[] args)throws /*FileNotFoundException,*/ /*IOException*/Exception {
        String s = "abc.txt1";
        /*
          method方法使用了throws异常处理方案
          往上抛异常,但是抛的是编译时期异常
          此异常让调用处接收了
          也就是说:method(s)接收了一个下面抛过来的编译时期异常
          所以此处爆红
         */
        method(s);
    }

    public static void method(String s)throws /*FileNotFoundException,*/ /*IOException*/Exception {
        if (s==null){
            //创建异常对象
            throw new IOException("IO异常了");
        }

        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new FileNotFoundException("文件找不到异常");//利用有参构造设置异常信息
        }

        System.out.println("我要执行");
    }
}

注意:

如果处理的多个异常之间,有子父类继承关系,我们可以直接抛父类异常

如果不知道多个异常之间到底有没有子父类继承关系,我们可以直接抛Exception

5.2异常处理方式(try…catch)

格式(一个catch)

try{
      可能会出现异常的代码
  }catch(异常类型 对象名){
      处理异常的方案->开发中将异常信息保存到日志文件中
  }
public class Demo07 {
    public static void main(String[] args) {
        String s = "abc.txt";
        try {
            //String s1 = null;
            //System.out.println(s1.length());//NullPointerException
            method(s);
        }catch (FileNotFoundException e){
            //如果try中的异常抓不到,try...catch外面的功能会受影响

            e.printStackTrace();//将异常详细信息打印出来
        }
        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    private static void method(String s) throws FileNotFoundException {
        if (!s.endsWith(".txt")) {
            throw new FileNotFoundException("文件找不到");
        }
        System.out.println("我要执行");
    }
}

格式(多个catch)

try{
      可能会出现异常的代码
  }catch(异常类型 对象名){
      处理异常的方案->开发中将异常信息保存到日志文件中
  }catch(异常类型 对象名){
      处理异常的方案->开发中将异常信息保存到日志文件中
  }catch(异常类型 对象名){
      处理异常的方案->开发中将异常信息保存到日志文件中
  }...

注意:

a.如果多个异常之间有子父类继承关系,先抓子类,再抓父类异常

b.如果多个异常之间有子父类继承关系,我们可以直接抓父类异常

6.finally关键字

​ 一定会执行的代码块,和try结合使用

public class Demo08 {
    public static void main(String[] args) {
        String s = "test.txt1";
        try {
            method(s);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            System.out.println("我一定要执行");
        }

    }

    private static void method(String s)throws FileNotFoundException {
        if(!s.endsWith(".txt")){
            throw new FileNotFoundException("文件找不到异常");
        }
    }
}

finally使用场景:

堆内存中的对象由GC(垃圾回收器)回收,但是有很多对象,如:IO流对象,网编 Socket对象,数据库连接对象(Connection)等,GC无法回收,既然GC没有办法回收,我们只能自己关闭资源,销毁对象,所以我们可以将关闭资源,销毁对象的操作放到finally中.

7.抛异常时注意的事项

​ 父类中的方法抛了异常,子类重写方法可抛可不抛

​ 父类中的方法没有抛异常,子类重写方法不要抛

8.try…catch和throws的使用时机

1.如果处理异常之后,还想让后续的代码正常执行,我们使用try…catch
2.如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try…catch做一个统一的异常处理

9.自定义异常

1.创建一个异常

  • 继承Exception,此时变成了编译时期异常
  • 继承RuntimeException,此时变成了运行时期异常

2.提供构造方法,方便设置异常信息

public class Demo09 {
    public static void main(String[] args) throws LoginUserException {
        //1.创建Scanner对象
        Scanner scanner = new Scanner(System.in);
        System.out.println("请您输入要登录的用户名:");
        String username = scanner.next();
        //2.定义一个字符串,代表已经注册过的用户名
        String name = "root";

        //3.判断
        if (username.equals(name)){
            System.out.println("登录成功");
        }else{
            //如果失败了,就创建异常对象
            throw new LoginUserException("登录失败");
        }
    }
}

public class LoginUserException extends Exception{
    public LoginUserException() {
    }

    public LoginUserException(String message) {
        super(message);
    }
}

10.打印异常信息的三个方法

Throwable中的方法:
public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误信息)
public String toString():获取异常的类型和异常描述信息(不用)
public void printStackTrace():打印异常的跟踪栈信息并输出到控制台上(最详细的异常信息)

标签:Java,String,void,基础,System,method,异常,public
From: https://blog.csdn.net/m0_73627305/article/details/140525838

相关文章

  • Leetcoede编程基础0到1——459.重复的子字符串 & 283.移动零 &1822.数组元素积的符号
    459.重复的子字符串给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。示例1:输入:s="abab"输出:true解释:可由子串"ab"重复两次构成。示例2:输入:s="aba"输出:false示例3:输入:s="abcabcabcabc"输出:true解释:可由子......
  • sql修炼笔记——基础操作指南篇
    基础操作指南1.新建数据库createdatabase·名称·(使用的是反引号,后者皆同)2.展示,showdatabases展示全部数据表3.数据类型INT --整数decimal(m,n)--有小数点的数如decimal(3,2)共三位数小数点占两位,如2.33varchar(n)最多存放n个字符blobBinarylargeobject图片影片档......
  • Java 基础学习第一节:初始 Java 及其安装
    第一节001.大项目贯穿学习能力动手能力耐心和毅力表达能力002.学习中碰到问题怎么办找同桌找同学找项目经理找讲师003.学习Java的窍门多想公司需要什么?熟练掌握这个东西的人.如何才能熟练呢?多练练学Java就像学车,天天看别人开车,自己无论怎么看都不会,必须亲自......
  • 第 10 节 函数的基础3
    函数1.生成式列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。#需求:生成一个1~10的整数列表list1=list(range(1,11))print(list1)#[1,2,3,4,5,6,7,8,9,10]#需求:生成列表:[1*1,2*2,3*3,4*4,5*5,6*6,7*......
  • ChatGPT:Java的双冒号运算符(::)
    ChatGPT:Java的双冒号运算符(::)为什么说双冒号运算符(::)通过引用现有的方法或构造器,简化了Lambda表达式的定义在Java中,双冒号运算符(::)是用于方法引用的符号。方法引用是一种更简洁、更直观的方式来表示Lambda表达式。它通过引用现有的方法或构造器,简化了Lambda表达式的定义......
  • 1--Web安全、渗透测试、基础入门--数据包
    Web的组成架构模型1.网站源码2.操作系统windows,linux3.中间件(搭建平台)apache,tomcat等4.数据库access,mysql,oracle,sybase等Web相关安全漏洞1.Web源码类对应漏洞SQL注入,文件上传,XSS,代码执行,变量覆盖,逻辑漏洞,反序列化等2.Web中间件对应漏洞3.Web数据库对应漏洞4.......
  • 计算机课设——基于Java web的超市管理系统
    smbms_java_web基于Javaweb的超市管理系统,数据库课程设计1.引言是一个基于JavaWeb连接MySQL的小项目。超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目,逻辑层次分明,基础功能包括用户的登录和注销,用户和供应商以及订单信息的增删查改的基础功能......
  • 【前端】JavaScript入门及实战21-25
    文章目录21关系运算符22编码23相等运算符24条件运算符25运算符优先级21关系运算符<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><scripttype="text/javascript"> /* 通过关系运算符可以比较两个值之间的大小关系, 如果关......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日派对座位安排(200分) - 三
    ......
  • java多线程等待唤醒机制详细介绍
    java多线程等待唤醒机制一.方法介绍方法说明voidwait()线程等待,等待的过程中线程会释放锁,需要被其他线程调用notify方法将其唤醒,重新抢锁执行voidnotify()线程唤醒,一次唤醒一个等待线程;如果有多条线程等待,则随机唤醒一条等待线程voidnotifyAll()唤醒所有等待线......