【JAVA基础教程】java中异常机制总结

【JAVA基础教程】java中异常机制总结

 Java 异常处理是使用 Java 语言进行软件开发和测试脚本开发时不容忽视的问题之一,是否进行异常处理直接关系到开发出的软件的稳定性和健壮性。那么我们来具体了解一下JAVA异常方面的内容。

一、什么是异常。 
  导致程序非正常结束,或导致程序可能出错(中断运行的原因)可谓异常。比如说我们常用的qq有时候会因为某种原因自动关闭了,这可以理解是一种异常。 
二、异常的种类 
  我们常见的异常可以分为两大类 
1.运行时异常 
比如: 
  (1)空指针异常 
当一个对象没有实例化拿过来用时会出现这样的异常,这种异常在运行时会抛出“java.lang.NullPointerException”这样的异常。 
如下代码:

package net.java.t;

/*

 * 测试类

 */

public class Test {

//声明Test对象属性

private static Test t;

/**

主函数

*/

public static void main(String[] args) {

t.play();

}

public void play(){}

}

便会产生这样的异常。 

(2)数组下标越界 
这种异常是我们做练习中经常遇到的,因为当你定义了一个数组后,这个数组的大小就是固定的。 
比如我们定义了这样一个数组int array[]=new int [8]; 
那么这个数组下边大小就只能从0到7当下标不在这个范围之内便产生异常。 
如上面我们创建的数组当我们再输入这样的代码array[8]=89;时,便会抛出“java.lang.ArrayIndexOutOfBoundsException: 8”并指出下标8出现越界错误。 

(3)栈溢出 
当程序陷入死递归,死循环都会出现栈溢出,这也是一种常见的运行时异常,该异常会抛出“java.lang.StackOverflowError”这样的异常。 

(4)类型转化错误 
我们知道当两个类有继承关系,当要实例化父类对象时,可以用子类来new 一个,这种便是类型的自动转化,当子类要转化成父类类型时就必须强制转化。 
如下: 

public class A extends B{

}

B b=new A();

这样是正确的,但是当我们用两个没有任何关系的类这样做时,假设上面所得A类和B类没有继承关系,当程序运行时便会抛出“java.lang.ClassCastException: net.java.t.B cannot be cast to net.java.t.A”这样的异常。 
从上面几个例子中,抛出的异常前面是异常的类型如java.lang.StackOverflowError 
java.lang.ClassCastException等等,而后面的是异常根据你代码的一些提示,这个能让你更好的去发现出现的异常在什么地方,如上面例子中的“8”和“B cannot be cast to net.java.t.A”。 

2.强制异常 
强制异常便涉及到了try{}catch(){}异常处理机制。 
所谓强制异常,便是出现异常,强制要你去处理这个异常,比如调用的方法中有未处理的异常(即方法中使用了throws异常类名),就要求我们必须去捕获这个异常并处理或者将这个异常再抛出,这也可以理解是对异常处理的一种方法。 
比如我们实例化一个文件类对象f并调用创建新文件的方法如下: 
File f=new File(); 
f.createNewFile(); 
第二句代码便是一个可能产生异常的语句(只是可能),因为当我们去创建一个新文件时要去指定它的路径,要是该路径不存在或者另外的原因使新文件不能产生,那么这样就会出现错误,所以在定义createNewFile()方法时便考虑到了这一点,所以在定义这个方法时用了throws异常类名下面是该方法定义代码: 

public boolean createNewFile() throws IOException {

SecurityManager security = System.getSecurityManager();

if (security != null) security.checkWrite(path);

return fs.createFileExclusively(path);

    }

可能我们会想这个异常从哪里来呢?在这里我们就很容易想到这也是自定义的一个东西果然在createNewFile()方法的返回值fs.createFileExclusively(path)调用的方法定义中我们可以看到这样的语句; 
下面是这个方法的定义: 

 public abstract boolean createFileExclusively(String pathname)

throws IOException;

该方法继续抛出异常,我们可以找到后面一个自定义异常对象。 
即throw 实例化的一个异常对象 
throws是将异常抛出。 
比如我们去定义这样一个方法: 

public void test() throws Exception{

int index = 8;

int array[]=new int [8];

array[index]=10;

if(index>=8||index<0){

throw new Exception(“数组越界”);

}

当你去调用这个方法时便会提醒你是要用try{}catch(){}去捕获异常并处理还是把异常再抛出即add throws declaration or surround with try/catch 
现在知道异常怎么来了吧。 

3.关于try{}catch(){}finally{}的运用 
这个语句用来发现异常并处理异常 
try{}大括号中用来放可能出现的代码语句,若有异常catch(){}会去铺货该异常,并在{}中去处理 
那要是try{}中有多个可能的异常存在呢? 
catch(){}中的小括号有带异常类对象参数当有多个异常时我们可以用多个catch(){}并给catch小括号参数分别设置可能的对应的异常类对象参数。或者将该参数设置成Exception e 该异常类是所有异常类的父类,这这边会实现父类子类对象间的自动转型。 
注意点:try()catch(){}语句,他只会执行捕获的第一个出现异常的代码语句,当第一个语句出现异常,它会去发现并捕获和处理,第二句代码就不会去执行。 
而finally{}是都会去执行的代码语句块,不管是否出现了异常在finally中的代码都会被执行。 

三.异常信息分析和程序调式 
上面讲了java中的异常种类举了不少例子,也可以看出java中出现异常都会给我们一些提示信息,这会大大方便了我们去寻找错误。 
一般异常信息分析和程序调式步骤可以如下: 

          1.根据异常类,来确定异常的类型(JDK的API) 
2.异常的提示信息 
3.找到出错的行(位置)【第一个类名是否是你定义的,如果不是,则再看下一行】 
4.分析问题(System.out.println();) 
5.修改代码 

          System.out.println();输出语句功能非常强大,是我们去调式程序的第一选择,比如上面例子的数组下标出现越界问题时,我们根据异常类java.lang.ArrayIndexOutOfBoundsException 
知道它是数组下标越界异常,利用输出语句将数组长度输出并根据异常提示信息数字8,知道是下标8出现了错误,在去找到改行代码,分析为什么会出现这样的错误,发现了原来我们定义的这个数组长为8但数组下标从0开始所以最大只能到7,这样我们就很快很改正这个错误了。。 

转载于:https://my.oschina.net/u/2367675/blog/425702

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109427.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • POJ 1011 Sticks

    POJ 1011 Sticks

  • [Warning] large integer implicitly truncated to unsigned type [-Woverflow][通俗易懂]

    [Warning] large integer implicitly truncated to unsigned type [-Woverflow][通俗易懂][Warning]largeintegerimplicitlytruncatedtounsignedtype[-Woverflow]警告的原因是:整数溢出整数溢出:当整数达到它所能表述的最大值时,会重新从起点开始#include<stdio.h>intmain(void){ unsigneda=12345678910; printf(“a=%d\n”,a); return0;}该程序输出以后并不是输出a=12345678910而是:上面的代码

  • 论.idea文件夹是干嘛的「建议收藏」

    论.idea文件夹是干嘛的「建议收藏」Problempython为什么每次创建的文件目录下都含.idea/文件夹?该文件夹又是用来干嘛的?Answer当使用pycharm作为IDE时,会自动生成.idea/文件夹来存放项目的配置信息。其中包括版本控制信息、历史记录等等。…

  • 用js来实现那些数据结构07(链表01-链表的实现)

    前面讲解了数组,栈和队列。其实大家回想一下。它们有很多相似的地方。甚至栈和队列这两种数据结构在js中的实现方式也都是基于数组。无论增删的方式、遵循的原则如何,它们都是有序集合的列表。在js中,我们新建

  • idea2022.2.4激活码(JetBrains全家桶)

    (idea2022.2.4激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • 课程设计题七:交通灯控制器[通俗易懂]

    课程设计题七:交通灯控制器[通俗易懂]要求:1、红灯和绿灯相互转换时经过黄灯,黄灯闪烁三次(6秒);2、主干道方向通行30秒,辅干道方向通行20秒,单独左转信号15秒;先直行信号,后左转信号。3、设手动、自动、特殊情况三种方式。4、特殊情况时所有路口红灯都亮,给120、110等通行。5、自动时显示各种状态倒计时。获取该程序+protues的方式:1、CSDN下载:https://download.c…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号