异常,我们软件都需要面对的一个问题。如何让你的软件更加健壮呢?这是一个值得我们考虑的问题。这里主要为大家介绍一下异常是什么,异常是如何产生的,如何将异常抛出,如何捕获异常,对于异常应该如何处理的个人一些见解。

异常是什么

         单就异常这两个字来说,异常的意思是:1.非正常的;不同于平常的异常现象。在我们代码中,异常指的是,在程序运行时,出现一些不正常的情况,使我们的程序无法正常运行或者对操作系统造成影响,使我们的程序无法得到预期的结果。这就是异常。这里需要说的是,我们的异常,指的是程序在运行时出现的一些问题,比如说你写了一个除法运算,用户将除数设置为了0,那么系统就会抛出异常。

异常是如何产生的

         异常产生的原因有很多,比如:除数为零,数组下标越界,读取的文件不存在等,字符类型做运算处理等,这里有很多都是逻辑上的异常。可能是用户输入了一些不合法的数据,但是没有相应的检查机制,于是进行了一些不正常的操作,导致产生了异常。
         异常出现后,程序可以生成一个异常类型的对象,这是系统生成的异常,这就是异常的生成。异常生成后会将异常交给java的运行系统,这是异常的抛出,具体实现下文会有介绍。现在先跟大家分享下编程人员如何自己从代码里生成异常吧,异常生成代码如下:
         
//生成异常的方法
void m(int i ) throws ArithmeticException
{
if (i==0)
{
//生成异常的代码
throw new ArithmeticException ("被除数为零");
}
        }	

这里的这个方法,当你调用的时候,如果将i传入0 ,那么,就会生成一个异常,并且返回给调用它的类。

异常如何抛出

	//抛异常的类,这里的主函数调用f类,然后通过f类调用m类,这时,m类将异常抛给f类,然后f类将异常接着抛给了主函数。
void f(int i) throws ArithmeticException
{
//调用m类
m(i);
}
//生成异常的方法
void m(int i ) throws ArithmeticException
{
if (i==0)
{
//生成异常的代码
throw new ArithmeticException ("被除数为零");
}
}

在这里,我们的f类调用了可以生成异常的m类,但是它并没有将m类抛给它的异常解决,而是通过
throws ArithmeticExeption 这个方法,将异常再次抛出,抛给了调用它的类。

 
       如果调用它的类还是不想或者是不能解决该异常,可以继续用同样的方法将异常抛出。

如何捕获异常

异常如何被捕获呢?先向大家展示一段代码:

           
public class TestEx
{
public static void main (String[] args)
{
int[] arr = {1,2,3};
System.out.println(arr[2]);
//异常的处理机制
try
{
//有可能出问题的代码
System.out.println(2/0) ;
}
//捕捉异常
catch (ArithmeticException ae)
{
//返回信息,如果出异常后会执行这块的内容
System.out.println("系统出异常了,请联系管理员");
ae.printStackTrace();
}
}
}
           在这里,我们的软件在运行时,自动生成了一个除数为0 的异常,我们在有可能发生异常的地方写一个try {}catch{}然后将有可能出现异常的代码写入try的括号中,将异常出现后的处理方法写入catch的括号中,如果出现异常的话,程序就可以按照设计人员的想法将异常处理,这样的话,可能就不会再将系统中断,这是异常的好处。
           下面是我们之前说的那个抛出的异常的捕获和处理:感兴趣的小伙伴可以看一下。
public class TestEx
{
public static void main (String[] args)
{
try
{
new TestEx().f(0);
}
catch (ArithmeticException ae)
{
ae.printStackTrace();
System.out.println("这是一个抛出了的异常!");
}
}

异常处理

           软件出异常是很正常的事,如何将异常捕获并处理这是需要我们考虑的,不是所有异常都是需要用户知情,需要用户知情的也不一定所有异常都要终止软件运行。如何 让软件更加的健壮、人性化。这是设计人员需要考虑的。
 
         我们可以用多个catch语句去捕捉异常,对于不同的异常提供不同的解决方案,但是需要注意的是:如果异常类有继承关系的话,要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch块可能被执行,否则子类型的catch块将永远无法到达,Java编译器会报错。

如果我们的程序只要出异常就需要进行某一操作:比如将异常记录。那么我们就可能会用到 finally语句块,它的写法类似于catch,不同之处在于它的括号中的内容肯定会执行。


         

java异常的一些小知识的更多相关文章

  1. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

  2. 学习笔记:Java的一些基础小知识之JVM与GC

      一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太 ...

  3. Java的一些基础小知识之JVM与GC (转)

    一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微 ...

  4. 【java】:通用小知识

    1.将String字符串放在最前面 为了防止偶发性的NullPointerException 异常,我们通常将String放置在equals()函数的左边来实现字符串比较,如下代码: // Bad i ...

  5. java中方法传值小知识解析

    1.java语言参数之间只有值传递,包括按值调用和按引用调用. 一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值. 按值调用:包括八大基本数据类型都是按值调用.传值的时候,也 ...

  6. 关于JAVA的一些零碎小知识

    1.经常遇到集合之间需要互相转化的 Array和List转化:Arrays.asList(数组):list.toArray(); List和Set转化:Set<String> set = ...

  7. java异常查看利器之使用 jvmti 的Callback_JVMTI_EVENT_EXCEPTION 事件查看异常

    阅读本文前需要了解什么是jvmti,jvmti全称称之为 JVM Tool Interface,有关jvmti更详细的知识,本文不再详细列出.大家可以借助百度来了解有关它更为详尽的内容. 在开源文件大 ...

  8. JAVA学习笔记—review基本知识[反射与异常]

    JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...

  9. Java基础小知识(一)

     序言:“不积跬步,无以至千里.不积小流,无以成江海.”每一个庞大的知识架构都是由无数个小知识点慢慢积累起来的,没有量变的积累,就没有质变上的飞跃,成功往往离不开积累. 今天就和大家分享一些我在学习J ...

随机推荐

  1. (中等) POJ 2886 Who Gets the Most Candies? , 反素数+线段树。

    Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...

  2. CI分页器pagination的原理及实现

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 下面这段代码是从官网上翻译过来的,介绍了分页的用例 1 2 3 4 5 6 ...

  3. Android SQLITE数据类型

    2011-6-24 15:14:00来源:Sql   SQLITE数据类型 SQLite与其他常见的DBMS的最大不同是它对数据类型的支持.其他常见的DBMS通常支持强类型的数据,也就是每一列的类型都 ...

  4. linux命令学习-2-dmesg

    DMESG NAME dmesg - print or control the kernel ring buffer(打印或者控制内核环缓冲) Usage: dmesg [options] Optio ...

  5. js div截取字符串的长度

    <div style="width:100%;" id="changdu">这个是字符串的长度</div> $("#chang ...

  6. UIImageView控件

    UIImageView是用于显示图像的,在iOS开发中,我们无需专门去写什么代码,不需要检查设备的类型,只需要把1x.2x.3x的图像添加到项目中,图像视图会自动的在正确的时间加载正确的图像. (1) ...

  7. iOS UICollectionView 长按移动cell

    ref:http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. . 手残效果图 ...

  8. org.springframework.data.mapping.PropertyReferenceException: No property created found for type

    错误原因:org.springframework.data.domain.SortSort sort=new Sort(Sort.Direction.DESC,"created_time&q ...

  9. CreateForm(

    /// <summary> /// 打开新的子窗体 /// </summary> /// <param name="strName">窗体的类名 ...

  10. 刪除預裝在windows 10 的app

    刪除預裝在windows 10 的app 步驟: 方法一.(易於解除安裝的app) 1. →按"開始標誌" →"所有應用程式" →在想解除的程式圖示上" ...