java抛错语句_Java【8】异常处理

原标题:Java【8】异常处理

1、异常处理概述

三类程序错误:

编译错误–因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置;

运行时错误–因为程序在执行时,运行环境发现了不能执行的操作

逻辑错误–因为程序没有按照预期的顺序和逻辑执行。

异常——程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等。如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。

异常——程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等。如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。

异常处理机制——当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

★ 掌握和编写异常处理机制程序:找到异常出现的逻辑、使用完整的数据测试、形成有针对性的异常处理。

2、异常的分类

128ff47ecb5265bc8c52fc59b5f85f1b.png

Throwable是所有异常的共同祖先,异常都是从Throwable继承而来的。Throwable有两个子类,Error和Exception。

① Error是错误,表示运行应用程序中出现了严重的错误,都是通过Error抛出的,一般是程序不能处理的系统错误。错误是没法处理的。

Error类包括一些不能被程序员处理的严重的系统错误类,共有12个直接子类,一般表示代码运行时 JVM(Java 虚拟机)出现的问题,如内存溢出、虚拟机错误、栈溢出等。这类错误与硬件有关,大多数错误与代码编写者执行的操作无关,通常由系统进行处理,程序本身无法捕获和处理。如:当JVM耗完可用内存时,将出现OutOfMemoryError。如Java虚拟机运行错误,将出现VirtualMachineError、类定义错误将出现NoClassDefFoundError等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。

② Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的错误。异常是可以被处理的!

af9a1ec14ad29773646b2a3e8d40bdbc.png

常见的异常有:

输入输出异常:IOException

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

操作数据库异常:SQLException

文件未找到异常:FileNotFoundException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

字符串转换为数字异常:NumberFormatException

方法未找到异常:NoSuchMethodException

883f61f3cb95a3829514e583d6e5275c.png

3、异常的捕获处理

401ba44ad2c9f1ee5ceac1d33053115e.png

115023bd3850efbe6f29905d562f9376.png

finally{ }语句块无论是否发生异常,都将被执行。它是整个捕获异常组合语句的出口,可以用来“善后”,如:释放资源、关闭文件。它是可选的操作。

异常:程序运行时,程序本身可以捕获并且可以处理的错误。

异常分为:

①运行时异常(不受检异常),一般由程序逻辑错误引起。不要求必须处理,编译器不检查。它是JVM在运行期间可能出现的错误,如数组越界、空值对象引用。

②非运行时异常(受检异常),比如IOException,必须处理!处理方式有两种:一是try-catch捕获,二是使用throws语句抛出。否则无法编译。

86a235b70b12b8ef2106d76b740447ce.png

2e8bcf989e6f795ba6b946371745004a.png

29e4c82e0c5896587783604eb46cedd2.png

d896118f999351ca0c0958af50bf4c8c.png

使用throws语句抛出异常

212e255512615c372098e176f65f80d7.png

使用try-catch语句捕获异常

082b9a5e60b51b05f811850a97fa335a.png

★ 存在多个异常时:异常的产生是由 语句中的异常顺序来决定的!

捕捉到第一个异常语句以后,就不会再执行该语句的后续语句了~

例如——下图代码,捕捉到数组定义时开辟的数量为负数,错误,抛出该错误,不再执行下面的语句,所以没有捕捉到除以0的错误。

5ed0cab9a96d59a53e6cb396b14c03eb.png

6200f3de69ec96c1c7badf8380078fae.png

try-catch-finally语句发生多重嵌套时,先去执行内层的语句;捕捉好内层的异常之后,再来执行靠外层的语句,捕捉异常。例如:

8449918ba0757a5502586aede4c40b4b.png

★eclipse中写异常语句——

77e570bafde187c9dbbd8a6a9839cabc.png

fb3881ea3ce31d5a2ebe8d2ce6c71ebd.png

0194b2da599c073b1cd7525075147089.png

5c5d18c4ae8b2a7951e8fbee075c25a8.png

4、重新抛出异常

重新抛出异常包括throw和throws两种语句。

a27deb56d3ac792173b352379851a108.png

下图代码中:throw语句明确抛出了一个空指针异常,改变了程序的执行流程(它后面的语句执行不到!!!),程序跳转到相应的异常处理语句中执行。

throw new NullPointerException(参数);

5d809997fafa91ee168127270b01a249.png

何时抛出异常???

f6eef943348464aa08b2e928f2bf0d54.png

下面是 throws语句——

注意看这张图的概念:

e4b7f70922b0667682a66abbe2fdf173.png

2de874f60fdc70759df1274301120d64.png

60ed09b7bc1f75e9ba68dd6e32c04a28.png

5、定义新的异常类型

系统已经给定的那些异常适用于大部分情况,但还要特定的情况需要自己定义新的异常类型。

8cf90f4d04541f2f81f6ec0f0949e2e7.png

自定义异常类的步骤:

34e841a005e74e460ba00430773fca0d.png

例子1:银行业务

新编写的一个 异常类:BankException

4cae848f76d12fc3fea78ce662107d0a.png

银行类:Bank

aadede3e081ddb7c914be4d62ed9e91c.png

主函数:

a4b45d6a8ec2acf8368186b9141baf1f.png

例子2:货船装载

e0d04cb1e7b7bbb387af9fb0d8cb70e3.png

069d955c8fd61462a070f87f2c7c30c8.png

e66e111432ba4f782571853e26da82ba.png

6、异常编程例题

货船装载问题

67d663016c7fdf70ca360c3e05b2e42c.png

import java.util.Scanner;

class DangerException extends Exception {

//starts

final String message = "超重";

public String warnMess {

return message;

}

//end

}

class CargoBoat {

int realContent; //装载的重量

int maxContent; //最大装载量

public void setMaxContent(int c) {

maxContent = c;

}

public void loading(int m) throws DangerException {

//starts

realContent += m;

if(realContent>maxContent) {

throw new DangerException;

}

System.out.println("目前装载了"+realContent+"吨货物");

//end

}

}

public class Main {

public static void main(String args[]) {

CargoBoat ship = new CargoBoat;

Scanner s=new Scanner(System.in);

ship.setMaxContent(1000);

int m=0;

try{

//starts

while("".equals(s)==false)

{m = s.nextInt;

ship.loading(m);

}

//end

}

catch(DangerException e) {

//starts

System.out.println(e.warnMess);

System.out.println("无法再装载重量是"+m+"吨的集装箱");

//end

}

finally {

System.out.printf("货船将正点启航");

}

}

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值