Java异常

异常

异常体系结构

1697807548978

异常处理机制

  • 默认处理机制

    • java中默认的异常处理机制:
      当程序出现异常后,会将异常包装在一个对应的对象中,并抛出此对象.
      并终止程序的运行.
  • 手动处理

    • Java中提供一套异常处理机制,在程序发生异常时,可以执行预先设定好的处理程序,执行完成后,程序不会停止,可以继续向后执行.
  • 异常处理:
    1.遇到异常就终止程序运行(不想要的)
    2.遇到程序异常时,进行处理

在写代码的时候,就要根据不同的情况设定好处理程序

运行程序

  • 如果程序执行时,出现问题,执行异常处理程序

  • 如果程序执行时,没有出现问题,不需要执行异常处理程序

注意: 语法错误 并非异常

  • int a = 10 后面忘加了分号,程序写错了

常见的几种异常

NullPointerException 当应用程序试图在需要对象的地方使用 null 时,会抛出此异常。例如,调用空对象的方法或访问空对象的成员变量。
IndexOutOfBoundsException 此异常通常发生在尝试访问数组、字符串或其他类型的集合时,索引超出了其实际范围
ArithmeticException 当出现异常的算术条件时,例如除以零,会抛出此异常。
ClassCastException 当尝试将对象强制转换为不是实例的子类时,会抛出此异常。
llegalArgumentException 当向方法传递了一个非法或不适当的参数时,会抛出此异常。
ConcurrentModificationException 当程序在迭代一个集合的同时,另一个线程试图修改这个集合,就会抛出这个异常
FileNotFoundException 当试图打开一个不存在的文件时,会抛出此异常
IOException 这是一个一般性的I/O错误,通常用于指示输入/输出操作失败或中断的异常。
ClassNotFoundException JVM试图通过其字符串名称加载类,但在已加载的类中找不到相应的类定义时,会抛出此异常
ArrayIndexOutOfBoundsException 当应用程序试图访问数组的非法索引时(即负数或大于等于数组大小的数)时,会抛出此异常。
NullPointerException 当一个应用程序试图在需要对象的地方使用 null 时,会抛出此异常。
NumberFormatException 当一个应用程序试图在需要对象的地方使用 null 时,会抛出此异常。
InterruptedException 当线程正在等待、休眠或占用,并且线程的中断优先级被设置为InterruptedException时,会抛出此异常。

异常处理中的几个常用关键字(try catch finally throw throws)

异常处理
   java中提供一套异常处理机制,在程序发生异常时,可以执行预先设定好的处理程序,
   执行完成后,程序不会停止,可以继续向后执行.
   
   在写代码的时候,就要根据不同的情况设定好处理程序,
   运行程序
   如果程序执行时,出现问题,执行异常处理程序
   如果程序执行时,没有出现问题, 不需要执行异常处理程序
   
   关键字
     try{
	    写代码,可能会出现异常
	 }catch(异常类型 a){ 捕获指定类型的异常
	    
	 }finally{
	     最终必须要执行的代码
	 }
	try{
            int[] a = {1,2,3};
            int b = a[4];
        }catch (ArrayIndexOutOfBoundsException a){
            a.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("666");
    }

注:如果出现多个错误,则会抛出共同的父类

throw 与 throws区别

在Java中,throwsthrow是两个不同的关键字,它们在异常处理中起着不同的作用。

  1. throws关键字:
    • throws用于声明一个方法可能会抛出的异常。当一个方法可能会抛出异常时,我们需要使用throws关键字在方法签名中声明这些异常。这样,调用该方法的代码就需要处理这些异常,或者继续向上抛出。
    • 例如,如果一个方法可能会抛出IOException,我们可以这样声明:public void readFile() throws IOException
  2. throw关键字:
    • throw用于手动抛出异常。我们可以使用throw关键字在代码中直接抛出一个异常对象。
    • 例如,我们可以这样手动抛出一个IOExceptionthrow new IOException("File not found");

总结一下,throws用于声明方法可能抛出的异常,而throw用于手动抛出异常。这两个关键字在异常处理中是相辅相成的,它们一起帮助我们处理和传递异常。

编译期异常和运行期异常的区别

编译期异常和运行期异常的区别如下

  1. 异常处理要求不同:编译期异常(也称为检测异常checked Exception)要求在代码中显式地处理(使用try-catch或者throws)。运行时异常(也称为unchecked Exception)不要求显式地处理。
  2. 异常检测时机不同:编译期异常在代码编译阶段就可以被检测到。运行时异常在代码运行过程中才能被检测到。
  3. 异常必要性不同:编译期异常通常表示外部环境或者业务逻辑上的问题,需要通过异常处理来解决。运行时异常通常表示程序中的错误或者编程错误,可以通过代码改进避免

自定义异常

JavaAPI中定义的标准异常类,都是与语法有关的(例如索引越界,空指针......),

但是我们的程序有可能不满足某种业务条件时,想以抛出异常的形式处理,此时就需要自定义一个与

业务相关的异常类来表示(如 分数不合法,提供scoreException);

  • 在Java中,您可以通过继承ExceptionRuntimeException类来创建自定义异常。这些异常可以具有您需要的任何特定格式。以下是一个创建自定义异常的简单示例

  • // 创建一个自定义异常类
    class MyException extends Exception {
        public MyException(String message) {
            super(message);
        }
    }
    
    // 在代码中抛出这个异常
    public class Test {
        public static void main(String[] args) {
            try {
                throwException();
            } catch (MyException e) {
                e.printStackTrace();
            }
        }
    
        public static void throwException() throws MyException {
            throw new MyException("这是我的异常");
        }
    }
    

    我们可以写一个分数评估的功能,如果出现非法输入可以抛出一个异常

    //自定义异常
    public class ScoreException  extends Exception{
        public ScoreException(){
    
        }
        public ScoreException(String message){
            super(message);//直接调用父类的构造方法
        }
    }
    
    package day14;
    
    public class TestScoreException {
        public static void main(String[] args) {
            try {
                System.out.println(scoreClass(1000));
            } catch (ScoreException e) {
                e.printStackTrace();
            }
        }
        public static char scoreClass(int score) throws ScoreException {
            if(score<0||score>100){
                throw new ScoreException("输入非法分数");
            }
            if(score>=90){
                return 'A';
            }else if(score>=80){
                return 'B';
            }else if(score>=70){
                return 'C';
            }else{
                return 'D';
            }
        }
    }
    

    image-20231028155759869

posted @   Yang0710  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
世间美好与你环环相扣 - 柏松
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 尹初七

作曲 : 柏松

编曲 : 彭圣杰

偏偏秉烛夜游

偏偏秉烛夜游

午夜星辰 似奔走之友

爱你每个结痂伤口

酿成的陈年烈酒

入喉尚算可口

入喉尚算可口

怎么泪水 还偶尔失守

邀你细看心中缺口

裂缝中留存 温柔

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

让樱花偷偷 吻你额头

让世间美好 与你环环相扣

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

当樱花开的纷纷扬扬

当世间美好 与你环环相扣

特别鸣谢:槿葵,我们的海报制作妹妹。

原唱:柏松

吉他:柏松

和声:柏松

录音:柏松

混音:张强

点击右上角即可分享
微信分享提示