首页 > 其他分享 >异常

异常

时间:2023-04-02 22:12:17浏览次数:22  
标签:System try println catch 异常 public

异常概述

异常:代表程序出现的问题

误区:不是让我们以后不出异常,而是程序出了异常之后,该怎么处理。

异常的继承体系:

  • Error:代表的系统级别错误(属于严重问题)

    系统一旦出现问题,sun公司会把这些错误封装成Error对象。

    Error是给sun公司自己用的,跟我们没啥关系,不需要管。

  • Exception:异常,代表程序可能出现的问题。

    我们通常会用Exception以及他的子类来封装程序出现的问题。

  • RuntimeException 以及它的子类:运行时出现的异常(如数组越界)

    编译阶段不会出现异常提示。

  • 其他异常:叫做编译时异常,编译阶段就会出现异常提示的。(如日期解析异常)

编译时异常:在编译阶段,必须手动处理,否则代码报错。目的是提醒程序员检查本地信息。

运行时异常:在编译阶段不需要处理,是代码运行时出现的异常。目的是:由于参数错误而导致的问题。

异常的作用:

  1. 异常是用来查询bug的关键参考信息。
  2. 异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。

异常的处理方式

异常有三种处理方式分别为:

JVM默认的处理方式

  • 把异常的名称,异常原因以及异常出现的位置等信息输出在控制台。
  • 程序停止执行,异常下面的代码不会再执行。

自己处理(捕获异常

捕获异常的目的:不让程序停止。

格式:

try{
    可能出现异常的代码;
} catch(异常类名 变量名){
    异常的处理代码;
}

目的:当代码出现异常时,可以让程序继续往下执行。

举例:

try{
    //可能出现异常的代码
	System.out.println(2/0);//这里出现了异常,程序就会在这里创建一个ArithmeticException对象
    					//new ArithmeticException();
    					//拿着这个对象到catch的小括号中进行对比,看小括号中的变量能否接收这个对象
    					//如果能接收,就表示这个异常被捕获(抓住),执行catch里面对应的代码
    					//当catch里面所有的代码执行完毕,继续执行try...catch体系下面其他代码
}catch(ArithmeticException e){
    //如果出现了ArithmeticException异常,我该如何处理
	System.out.println("算数异常");
}

使用情况:

  1. 如果try中没有遇到问题,那么就不会执行catch中的代码,而是执行try中代码。

  2. 如果try中遇到多个问题,会写多个catch与之对应

    如果要捕获多个异常,这些异常中如果存在继承关系,那么父类一定要写在最下面。

    在jdk7以后可以在catch中的同时捕获多个异常,中间用 |隔开

    catch(ArrayIndexOutOfBoundsException | ArithmeticException e )表示如果出现了A异常或B异常,采用同一种处理方案。

    public class Text {
        public static void main(String[] args){
            int[] arr={1,2,3,4,5,6};
            try{
                System.out.println(arr[10]);//如果没有写多个catch
                System.out.println(2/0);
                String s=null;
                System.out.println(s.equals("abc"));
            }catch (ArrayIndexOutOfBoundsException e){
                System.out.println("索引越界");
            }catch (ArithmeticException e){
                System.out.println("算数异常");
            }catch (NullPointerException e){
                System.out.println("空指针异常");
            }
            System.out.println("看看我执行了么");
        }
    }
    

    上面这么多catch,只能输出第一个捕获到异常的catch中的代码。

    建议按照try中代码顺序依次写catch捕获对应的异常,增强可读性。

  3. 如果try中遇到的问题没有被捕获,即catch中写的依次与实际引发的异常不一样,这样就会无法捕获到异常。

    此时相当于try catch代码白写了,最终采用JVM进行默认处理。

  4. 如果try中遇到了异常,那么try下面的其他代码就不会执行了

    public class Text {
        public static void main(String[] args){
            int[] arr={1,2,3,4,5,6};
            try{
                System.out.println(arr[10]);
                System.out.println("这里不执行了");//这段代码就不会执行
            }catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("索引越界");
            }
            System.out.println("看看我执行了么");
        }
    }
    
    

异常中常用方法(Throwable的成员方法):

方法名 说明
public String getMessage() 返回异常的简短描述
public String toString() 返回异常的详细描述
public void printStackTrace() 把异常的错误信息输出在控制台

第三个方法虽然会把异常的所有信息打印在控制台和JVM默认处理方法一样,但是!!不会停止运行下面的代码

第三个方法包含了上面两个方法的信息,是最常用的。

第三个方法在底层利用System.err.println进行输出,在控制太显示红色字体

交给调用者处理(抛出异常

抛出异常的目的:告诉方法调用者这个方法出错了!

方法抛出异常要写两个部分:

  1. throws

    写在方法定义处,表示声明一个异常。告诉调用者,使用本方法可能有哪些异常。

    如果是编译时异常:必须要写

    如果是运行时异常:可以省略不写

    public void 方法() throws 异常类名1,异常类名2,....{
        
    }
    
  2. throw

    写在方法内,结束方法。手动抛出异常对象,交给调用者。方法中下面的代码不再执行了。

    public void 方法(){
        throw new NullPointerException();
        System.out.println("这部分代码不会执行");
    }
    
  3. 完整写法

    public void 方法() throws 异常类名1,异常类名2,...{//如果是runtime异常可以不写
        throw new NullPointerException();
        System.out.println("这部分代码不会执行");
    }
    

举例:

//写一个获取数组最大元素的方法
public int getMax(int[] arr){
    if(arr==null){
        //此时抛出异常
        throw new NullPointerException;
    }
    if(arr.length==0){
        throw new ArrayIndexOutOfBoundsException();
    }
    int max=arr[0];
    for(int i=1;i<arr.length;i++){
        if(arr[i]>max){
            max=arr[i]
        }
    }
    return max;
}
public class Text {
    public static void main(String[] args){
        int[] arr=null;
        int max=0
        try{
            max=getMax(arr);//将调用方法的代码用try进行捕捉,要不然下面的代码将无法执行。
        }catch(NullPointerException e){//空指针异常
            e.printStackTrace();
        }catch(ArrayIndexOutOfBoundsException e){//索引越界异常
            e.printStackTrace();
        }
    }
}

自定义异常

写法:

  1. 定义异常类

  2. 写继承关系

    如果是运行时异常:继承RuntimeException

    如果是编译时异常:继承Exception

  3. 空参构造

  4. 带参构造

自定义异常的意义:让控制台的报错信息更加见名知意。

可以在Catch中捕捉哪些java中没有定义的比如说名字规范等情况。

自定义异常的规范写法:

public class NameFormatException{}
//NameFormat:异常名字
//Exception:表示这是一个异常类
//使用大驼峰命名法

举例:

public class NameFormatException extends RuntimeException{//姓名格式异常(自定义的)(idea快捷键alt+insert自动补齐即可)
    public NameFormatException() {
    }
    public NameFormatException(String message) {//传入异常的信息
        super(message);
    }
}

标签:System,try,println,catch,异常,public
From: https://www.cnblogs.com/wdadwa/p/17281539.html

相关文章

  • 【转】【Revit】revit二次开发——基于teigha读取CAD几何与文字(提供源码、引用包与异
    1.下载64位Teigha完整包:链接:https://pan.baidu.com/s/1KXW54YlkkWJZNQYhbc99kw提取码:05052.VS平台架构选择64位,.net版本4.0以上:  3.dll必须手动指定引用:(重点)staticstringdll=@"D:\Desktop\Rvt\bin\Debug\TD_Mgd.dll";//引用位置Assemblya=Assembly.UnsafeL......
  • 统一异常处理
    在web项目开发中,不管是mapper层、service层还是controller层,都有可能发生异常。如果每个异常都单独处理,系统的代码耦合性高,工作量大,维护困难。SpringMVC能将所有类型的异常处理,从各层的各种处理过程中解耦出来,进行统一处理,既保证了相关处理过程的功能较单一,也实现了异常信息的......
  • Python异常 ValueError的问题详解
    导读这篇文章主要介绍了Python异常ValueError的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教Python异常ValueErrorValueError:invalidliteralforint()withbase10:'*'试图将一个与数字无关的类型转化为整数,会抛出该异常。......
  • Eclipse中代码无异常缺编译报红
    Eclipse中代码无异常缺编译报红背景:在Eclipse中,明明代码没有问题,之前编写好的类,重启Eclipse之后就出现编译期间爆红,注释也爆红。解决Window→Preferences→Java→Compiler→Building把Buildpathproblems中的IncompletebuildpathCirculardependencies两个属性从默认......
  • C# 直接在子线程中对窗体上的控件操作是会出现异常
    https://www.bbsmax.com/A/MAzA8klpd9/ Form1里privatedelegatevoidDispMSGDelegate(intindex,stringMSG);publicvoidDispMsg(intiIndex,stringstrMsg){if(this.richTextBox1.InvokeRequired==false)......
  • SimpleDateFormat并发引发的multiple points 异常以及解决
    SimpleDateFormat并发引发的multiplepoints异常以及解决一、问题分析SimpleDateFormat并发会出现如下问题:1、java.lang.NumberFormatException:multiplepoints 2、 java.lang.NumberFormatException:emptyString 3、java.lang.NumberFormatException:Forinputs......
  • 一文搞懂Java异常处理
    一、什么是异常处理在Java编程中,异常处理是一种机制,用于处理程序运行时可能出现的异常情况。当程序出现异常时,程序会抛出一个异常对象,如果不加以处理,程序就会终止运行。因此,我们需要使用异常处理机制来捕获并处理这些异常,以使程序能够在出现异常时继续运行。在Java中,异常处理主要......
  • Mac 上启动nacos 出现异常java.lang.IllegalArgumentException: the length of secret
    这个异常提示是因为Nacos的配置中加密相关的参数未正确填写所导致的。我们只需要找到nacos/conf/application.properties文件,然后给nacos.core.auth.plugin.nacos.token.secret.key这个属性配置一个大于32位的随机字符串即可这个字符串大家可以在jwt的官网去生成:https://jwt.......
  • Float 或者 Double 除以零不会抛出 java.lang.ArithmeticExceptionL:/by zero 异常
    1.Java的浮点运算是基于IEEE-754标准来的。IEEE-754standardJava'sFloating-PointOperations2.Java语言规范https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.31.0/0=+Infinity-1.0/0=-Infinity0/0=NaN......
  • 客户端日志和异常处理
    目录一.使用Serilog结构化日志记录日志信息二.捕获全局异常三.使用AOP统一处理异常一.使用Serilog结构化日志记录日志信息Serilog包的引用和使用语法都可以在网上找到(https://github.com/serilog/serilog/wiki/),不再赘述,这里仅分享一下自己在项目中的简单使用。FileLogHelpe......