java根底(十四)反常处理A8站源码交易平台

摘要:一般来说,一个项目中多个类都会发作的一同反常应该考虑规划为一个反常类。关于简略过错,最好进行部分处理(if-else),无须抛出反常,当有必要处理不行意料的过错情况时应运用try-catch,否则用逻辑测验去处理,不要容易糟蹋体系资源。

A8站源码交易平台

关键:反常是运转时过错。反常处理使得程序能够处理运转时过错,而且持续一般的履行。


在程序运转过程中,假如JVM检测出一个不或许履行的操作,就会呈现运转时过错(例如,运用一个越界的下标拜访数组等)。在Java中,运转时过错会作为反常抛出。反常便是一种现象,标明阻挠正常运转的过错或情况。假如反常没有被处理,那么程序将会非正常停止。那么怎么处理反常使得程序能够持续运转或许高雅的停止呢?

1.2 反常处理概述
关键:反常是从办法抛出的。办法的调用者能够捕获以及处理该反常。

榜首种办法是运用逻辑,判别或许呈现的过错(例如:除数为0),给出提示(提示语)以及接下来的操作(放入循环中从头输入或完毕输入)

第二种便是咱们的反常机制了。

办法怎么告诉它的调用者一个反常产生了呢?Java能够让一个办法抛出一个反常,该一场能够被调用者捕获和处理。如下例:

import java.util.Scanner;
 
public class QuotientWithException{
public static int quotient(int number1,int number2) {
if(number2==0) {
throw new ArithmeticException("Divisor cannot be zero");//反常类创立的反常目标并抛出,调用catch块
}
return number1/number2;
}

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter two Integers: ");
int number1 = input.nextInt();
int number2 = input.nextInt();
try {
int result = quotient(number1,number2);//这里边或许要抛出反常
System.out.println(number1+" / "+number2+" is "+result);
}catch(ArithmeticException ex){
System.out.println("Divisor cannot be zero");//反常处理办法
}

System.out.println("OK~");
}
}
这样编译器就不会报错,而是当发作指定的动作抛出指定过错类型然后履行你指定的动作。A8站源码交易平台

1.3 反常类型
关键:反常是目标,而目标都选用类来界说,反常的根类是java.lang.Throwable.能够经过承继Exception或许其子类来创立

1.3.png
这些反常类能够分为三种首要类型:体系过错、反常和运转时反常。

(1)体系过错

体系过错(System Error)是由Java虚拟机抛出的,用Error类(内部体系过错)标明,这样的过错很少发作,假如发作,除了告诉用户以及尽量保险地停止程序外,简直什么也不能做。

(2)反常(Exception)

反常是用Exception类标明的,它描绘的是由你的程序和外部环境所引起的过错,这些过错能被程序捕获和处理。

(3)运转时反常(Runtime Exception)是用RunTimeException类标明的,它描绘的是程序规划过错,例如过错的类型转化等。

Runtime Exception、Error以及它们的子类都称为免检反常。一切其他反常都称为必检反常,编译器强制程序员查看并经过try—catch块处理它们。

 

2.1 关于反常处理的更多评论A8站源码交易平台
关键:反常的处理器是经过当时的办法开端,沿着办法调用链,依照反常的反向传达方向找到的。

Java的反常处理模型根据三种操作:声明一个反常、抛出一个反常和捕获一个反常。

 

2.1.1 声明反常  A8站源码交易平台
每个办法都有必要声明它或许抛出的必检反常的类型。这称为声明反常。除了Error和RuntimeException,其他反常都有必要在办法头中显式声明。这样办法的调用者才会被奉告有反常。

在办法中声明一个反常,就要在办法头中运用关键字throws:

public void myMethod() throws IOException,Exception2,...n

关键字throws标明mvMethod,或许会抛出它后边的那些反常列表里的反常

留意:假如父类中的办法没有声明反常,那么就不能在子类中对其重写时声明反常

 

2.1.2 抛出反常A8站源码交易平台
检测到过错的程序能够创立一个适宜的反常类型的实例并抛出它,这称为抛出一个反常。

IllegalArgumentException ex = new IllegalArgumentException ("Wrong Argument");//反常描绘信息可选

throw ex;

或许 

throw new IlleagalArgumentException("Wrong Argument");

留意:声明反常的关键字是throws,抛出反常的关键字是throw

 
2.1.3 捕获反常
当抛出一个反常时,能够在try—catch块中捕获或处理它。假如try块中的某条句子抛出一个反常,Java就会越过try中剩下的句子,然后开端查找处理这个反常的代码。处理这个反常的代码称为反常处理器,能够从当时办法开端,沿着办法调用链,依照反常的反向传达方向找到这个处理器。从榜首个到最后一个逐一查看catch块,判别在catch块中的反常类实例是否是该反常目标的类型,假如是,就将该反常目标赋值给所声明的变量。然后履行catch中的代码。假如没有发现反常和其处理器,Java就会退出这个办法,然后把反常传给这个办法的调用者。父类的反常类型也有必要比子类的反常类型规模大。

 
2.1.4 从反常中获取信息 A8站源码交易平台
2.1.4.png
2.1.5 finally字句
关键:不管反常是否发作,finally字句总会被履行

有时分,不管反常是否发作,都期望履行某些代码,Java的finally字句能够用来完成这个意图。

语法结构:

try {
statements;
}catch(TheException ex){
handling ex;
}
finally {
finalStatements;
}
 三种情况:(1)try中没有反常(2)try中有反常被捕获(3)try中有一场没有被捕获

上面三种情况finally块均履行。

2.1.6 何时运用反常
关键:当过错需求被办法的调用者处理的时分,办法应该抛出一个反常。

try块包含正常情况下履行的代码,catch块下是反常情况需求处理的代码,反常处理将过错处理代码从正常的编程使命中分离出来,但由于反常处理需求沿着办法调用链来传达反常,所以需求更多的时刻和资源。应该创立一个反常目标并抛出,假如能在发作反常的办法中处理反常,那么就不需求抛出或运用反常。

一般来说,一个项目中多个类都会发作的一同反常应该考虑规划为一个反常类。关于简略过错,最好进行部分处理(if-else),无须抛出反常,当有必要处理不行意料的过错情况时应运用try-catch,否则用逻辑测验去处理,不要容易糟蹋体系资源。

2.1.7 从头抛出反常
关键:假如反常处理器不能处理一个反常,或许仅仅简略地期望它地调用者留意到该反常,Java答应该反常处理器从头抛出反常。

try{
 
statements;
 
}catch{TheException ex}{
 
perform operations before exits;
 
throws ex;
 
}
句子throw ex从头抛出反常给调用者,以便调用者的其他处理器处理反常ex的时机。

2.1.8 链式反常
关键:与一个反常一同抛出一个反常,构成链式反常。

public static void main(String args[]) {
try {
method1();
}
catch(Exception ex){
ex.printStackTrace();
}
}

public static void method1() throws Exception{
try {
method2();
}catch(Exception ex) {
throw new Exception("new Info from method2",ex);
}
}

public static void method2() throws Exception{
throw new Exception("new Info from method1");
}
method1办法把method2办法的反常包装成了簇新的反常,新反常被抛出,在main中被捕获,进行打印,先打印新反常,在打印meithod2中的原始反常。

2.1.9 创立自界说反常
关键:能够经过承继java,lang,Exception类来界说一个自界说反常类。

由于Java现已供给了相当多的反常类,那么尽量运用它们,假如遇到不能用预界说类来充沛描绘问题,那么就能够经过集成类来创立自己的反常类。

public class InvalidRadiusException rxtend Exception{
    private double radius;    
    public InvalidRadiusException (double radius){
        super("Invalid radius"+radius);
        this.radius = radius;
    }
}
其间是重写了的反常信息。
A8站源码交易平台


  • 全部评论(0)
最新发布的资讯信息
【A8站-免费源码分享|直播源码】直播系统源码开发:关于安卓开发工具和obs直播推流(2020-10-30 09:41)
【计算机/互联网|】【独家修复】用户定制版短视频点赞系统,支持抖音+快手+刷宝+微视等所有主流短视频评论系统源码(2020-10-26 16:34)
【技术宅-为技术而疯|网站架设教程】【独家首发】最新更新已对接短信2020全新抖音快手点赞任务系统霸屏天下小红书头条威客兼职完整搭建架设视频教程(2020-10-25 13:56)
【技术宅-为技术而疯|网站架设教程】最新可用个人发卡网系统源码完整搭建架设视频教程(2020-10-25 10:53)
【技术宅-为技术而疯|网站架设教程】独家更新全新V10抢单系统唯品会京东淘宝自动抢单区块系统源码全开源抢单收单接单返利+搭建架设完整视频教程(2020-10-25 10:52)
【计算机/互联网|】柔丫纸尿裤云仓系统源码部署(2020-10-15 18:13)
【计算机/互联网|】侏罗纪软件模式定制开发(2020-10-14 15:33)
【计算机/互联网|】S2b2C供应商系统 营销闭环(2020-10-10 17:46)
【计算机/互联网|程序设计开发】盛都汇系统奖励机制(2020-10-10 17:20)
【A8站-免费源码分享|网站源码】积分商城系统APP开发(2020-09-23 14:56)
联系我们
Q Q:3101359898 点击直接对话
电话:18580901894
邮箱:admin#a8zhan.com
时间:09:00 - 24:00
手机二维码 访问手机版
返回顶部