Java 异常

Posted 我是痕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 异常相关的知识,希望对你有一定的参考价值。

异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,可通过java以类的形式进行描述。并封装成对象。

一、问题的划分

  1. 严重的问题
    • java通过Error类进行描述。一般不编写针对性的代码对其进行处理。
  2. 非严重的问题
    • java通过Exception类进行描述。可以使用针对性的处理方式进行处理。

二、异常的处理

  • java 提供了特有的语句进行处理。
  • 一般情况下,函数内出现异常,函数上需要声明。
  • jvm默认的异常处理机制,就是在调用printStackTrace方法(打印异常的堆栈的跟踪信息)
  • 当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
    • 要么在内部try catch处理。
    • 要么在函数上声明让调用者处理。
try{
	需要被检测的代码;
}
catch(异常类 变量){
	处理异常的代码;(处理方式)
}
//可选
finally{
	一定会执行的语句;
}

class Demo {
    int div(int a, int b)throws ArithmeticException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
    {
        return a / b;
    }
}

class ExceptionDemo {
    public static void main(String[] args) {
        Demo d = new Demo();
        try {
            int x = d.div(4, 0);
            System.out.println("x=" + x);
        } catch (ArithmeticException e)/ArithmeticException e = new ArithmeticException();
        {
            System.out.println("除零啦");
            System.out.println(e.getMessage());
            System.out.println(e.toString());// 异常名称:异常信息。

            e.printStackTrace();//异常名称,异常信息,异常出现的位置。
        }
        System.out.println("over");
    }
}

运行结果:
除零啦
/ by zero
java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
at Demo.div(Test.java:54)
at Test.main(Test.java:66)
over

对多异常的处理

  1. 声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
  2. 对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
  3. 如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

自定义异常

当出现的特有问题未被java所描述并封装对象。可以按照java对问题封装的思想,将特有的问题进行自定义的异常封装。

如何定义异常信息呢?

因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。

  • 必须是自定义类继承Exception。

throws和throw的区别

  • throws 使用在函数上。后面跟多个异常类,用逗号隔开。
  • throw 使用在函数内。后面跟的是异常对象。
class FuShuException extends Exception //getMessage();
{
    private int value;
    
    FuShuException(String msg, int value) {
        super(msg);
        this.value = value;
    }

    public int getValue() {
        return value;
    }

}


class Demo {
    int div(int a, int b) throws FuShuException {
        if (b < 0) {
            throw new FuShuException("出现了除数是负数的情况------ / by fushu", b);//手动通过throw关键字抛出一个自定义异常对象。
        }
        return a / b;
    }
}


class Test {
    public static void main(String[] args) {
        Demo d = new Demo();
        try {
            int x = d.div(4, -9);
            System.out.println("x=" + x);
        } catch (FuShuException e) {
            System.out.println(e.toString());
            System.out.println("错误的负数是:" + e.getValue());
        }
        System.out.println("over");

    }
}

运行结果:
FuShuException: 出现了除数是负数的情况------ / by fushu
错误的负数是:-9
over

以上是关于Java 异常的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 EditText 上的空指针异常 [重复]

Java异常处理机制

片段 getArguments() 空指针异常

Android Java:在 onCreateView() 中返回空视图的片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段