【JAVA】Java中的异常与错误,处理异常和自定义异常

本文深入解析Java中的异常处理机制,区分异常与错误的概念,详细阐述运行期异常与非运行期异常的区别,以及如何通过try...catch...finally...进行异常处理。同时,介绍了自定义异常的创建与使用。

java语言根据错误性质将运行错误分为两类:异常和错误

java语言认为那些可预料和不可预料的出错称为Throwable

API 中标准异常的顶级父类是Throwable

Throwable类中有两个子类ExceptionError


错误Error

错误程序没法处理,例如内存泄漏;所有错误都是Error类的直接或间接子类。

包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。

这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理,程序本身无法捕获和处理。


异常Exception

在程序运行时不正常的事件;如果程序员处理异常,程序可以继续执行;

所有异常都是Exception类的直接或间接子类。

为了保证程序的健壮性,Java要求必须对这些可能出现的异常进行捕获,并对其进行处理。

Exception分类:

  • 运行期异常 = 非检查异常:

RuntimeException的子类;

这些异常在编译期不检测,程序中可以选择处理,也可以不处理

如果不处理运行时会中断,但是编译没问题

  • 非运行期异常 = 检查异常:

其他的Exception子类

是必须进行处理的异常,如果不处理,将发生编译期错误


常见的运行期异常:


空指针异常:

NullPointerException

String str = null;
System.out.println(str.length());

注意如果String s="";调用s.length()不会发生空指针异常;因为“”不等于null


数组下标越界异常:

ArrayIndexOutOfBoundsException

int[] nums = new int[3];
System.out.println(nums[10]);

类转换异常:

ClassCastException

Object obj = new Object();
ExceptionTest e = (ExceptionTest)obj;

数字格式异常:

NumberFormatException

int num1 = Integer.parseInt("abc");

算数异常:

ArithmeticException

int res = 10/0;
System.out.println("结果:"+res);

处理异常try...catch...finally...

try{
    [可能抛出异常的代码块];
}catch(异常类型1  变量名){
  	[处理异常的代码];
} catch(异常类型2  变量名){
  	[处理异常的代码];
}finally{
    [不管什么情况,一定被执行的代码块];
}

try 不能单独使用,可以跟上 catch 或者是 finally;可以是 trycatch;或者 tryfinally

Throwable、Exception、RuntimeException可以同时使用,但是父子关系的,子类型方法前边。

catch可以使用多个,finally最多只有一个。


自定义异常:

一般自定义异常类中不写其他方法,只重载必要的构造方法

可以用throw抛出自定义异常对象,使用throws声明自定义异常类型

public class MyScoreException extends Exception {
    //构造方法
    public MyScoreException(String msg){
        super(msg);
    }
}
public class MyExceptionTest {
    //方式2
    public static void main(String[] args) throws MyScoreException{
        Scanner input = new Scanner(System.in);

        System.out.print("请输入成绩:");
        int score = input.nextInt();

        if(score<0 || score>100){
            //抛出自定义异常
            throw new MyScoreException("成绩必须是百分制");
            //方式1
            /*try{
                throw new MyScoreException("成绩必须是百分制");
            }catch(MyScoreException e){
                e.printStackTrace();
                System.out.println("捕获了异常");
            }*/
        }

        System.out.println("您输入的成绩是:"+score);

    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值