Java基础教程——异常处理详解

异常处理

好程序的特性

  • 可重用性
  • 可维护性
  • 可扩展性
  • 鲁棒性
    |--|--Robust的音译
    |--|--健壮、强壮之意
    |--|--指在异常和危险情况下系统依然能运行,不崩溃



Java中,写下如下代码:

public class TestException {
    public static void main(String[] args) {
        int a = 10 / 0;
        System.out.println("-END-");
    }
}

代码运行到“10 / 0”时出错,整个程序会中断,表现为最后的"-END-"没有输出。

 java.lang.ArithmeticException: / by zero

很显然这不算好的程序,好的程序应该做好异常处理,不能说一处出错整体崩盘。


异常处理

异常处理,就是当程序出了错误时,系统不崩溃。

顶层类:Throwable

大分类 小分类
Error 处理不了
Exeption 编译时异常 必须处理(不处理编译不通过)
运行时异常 可以处理

Error示例:

public class TestError {
    // Exception in thread "main" java.lang.StackOverflowError
    public static void main(String[] args) {
        m();
    }
    static void m() {
        m();
    }
}

不断递归,导致出现栈溢出:

Exception in thread "main" java.lang.StackOverflowError

编译时异常:

import java.io.FileNotFoundException;
public class 异常处理 {
    static void TestException1() {
        try {
            throw new FileNotFoundException("编译时异常,必须处理,要么自己处理,要么抛出");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    static void TestException2() throws FileNotFoundException {
        throw new FileNotFoundException("编译时异常,必须处理,要么自己处理,要么抛出");
    }
    public static void main(String[] args) {
        TestException1();
        try {
            TestException2();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

try.catch.finally

Try{尝试执行}
Catch{出错时执行}
Finally{出不出错都执行,在return之前执行}
public class 异常处理 {
    public static void main(String[] args) {
        int a = 10, b = 0;
        TestException(a, b);
    }
    static boolean TestException(int a, int b) {
        try {
            System.out.println(a / b);
        } catch (ArithmeticException e) {// 声明,此处可能抛出"算术异常"
            System.out.println("系统维护中,请稍后重试");
            return false;
        } finally {
            System.out.println("---END---");
        }
        return true;
    }
}

运行结果:

系统维护中,请稍后重试
---END---

try(with resources)语法

从Java 7开始,Java支持try-with-resources 语句,称为 ARM 块(Automatic Resource Management) ,自动资源管理——try...catch代码运行完毕后,自动释放资源,即使出现异常也会关闭资源。
这种语句可以使得try...catch代码变得简洁(手动关闭资源往往需要考虑多种场景,导致代码臃肿)。

这个功能在IO中用的比较多,Scnner没必要做异常处理,以下仅是一个示例:

import java.util.Scanner;
public class TryWith {
    public static void main(String[] args) {
        testTryWith();
        testTryWith();
    }
    private static void testTryWith() {
        try (Scanner sc = new Scanner(System.in)) {
            sc.nextLine();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally");
        }
    }
}
finally
java.util.NoSuchElementException: No line found
finally
扩展阅读:
[try...catch的前世今生]: https://www.cnblogs.com/tigerlion/p/10659675.html

throw自定义异常

自定义异常类,继承Excption类

一般需要写一个带参构造方法

public class Test自定义异常 {
    public static void main(String[] args) {
        int a = 10;
        TestException(a);
    }
    static boolean TestException(int money) {
        try {
            if (money < 10000) {
                // 拋一個異常對象
                throw new DidiException("系統升級,請半年后重試");
            }
        } catch (Exception e) {// 声明,此处可能抛出"算术异常"
            e.printStackTrace();
            return false;
        } finally {
            System.out.println("---END---");
        }
        return true;
    }
}
class DidiException extends Exception {
    public DidiException(String message) {
        super(message);
    }
}

运行结果:

DidiException: 系統升級,請半年后重試
---END---
    at Test自定义异常.TestException(Test自定义异常.java:10)
    at Test自定义异常.main(Test自定义异常.java:4)

原文地址:https://www.cnblogs.com/tigerlion/p/11179218.html

时间: 2024-10-21 16:34:05

Java基础教程——异常处理详解的相关文章

java基础之:详解内部类(转载)

可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. [java] view plain copy print? public class OuterClass { private String name ; private int age; public String getName() {

Java基础:泛型详解

泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用.什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参).泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型).也

JAVA异常与异常处理详解

一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都继承于Throwable类.Throwable主要包括两个大类,一个是Error类,另一个是Exception类: 2.其中Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者: 3.Exception类,也就是通常所说的"异常".主要指编码.环

Java基础之序列化详解

相关定义及用途 java序列化(又叫串行化)技术可以使你将一个对象的状态写入一个Byte流里,并且可以从其他地方把该Byte流里的数据读出来,重新构造一个相同的对象.这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库.文件等系统里.java的序列化机制是RMI(远程方法调用).EFB等技术的技术基础. 用途:利用对象的序列化实现保存应用程序的当前工作状态,下次再启动的是时候将自动恢复到上次执行的状态. 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可

java基础篇---枚举详解

在JDK1.5之前,JAVA可以有两种方式定义新类型:类和接口,对于大部分面向对象编程,有这两种似乎就足够了,但是在一些特殊情况就不合适.例如:想要定义一个Color类,它只能有Red,Green,Blue三种,其他值则是错误,在JDK1.5之后便引入枚举类型. 枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值. public enum Color{ RED,GREEN,BLUE ; // 定义三个枚举的类型 }; 枚举中有三个取值

Java基础之ThreadPoolExecutor详解

Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的.基于ThreadPoolExecutor可以很容易将一个Runnable接口的任务放入线程池中. ThreadPoolExecutor的构建参数: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeU

Java基础(52):ClassCastException详解(转)

ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这种异常是如何产生的呢?举一个比较形象的例子. Animal表示动物,Dog表示狗,是动物的子类,Cat表示猫,是动物的子类.看下面的代码: 1 Animal a1 = new Dog(); // 1 2 Animal a2 = new Cat(); // 2 3 4 Dog d1 = (Dog)a1

java基础之反射 详解

首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Reflection API JAVA反射机制提供了什么功能 获取类的Class对象 获取类的Fields 获取类的Method 获取类的Constructor 新建类的实例       Class<T>的函数newInstance       通过Constructor对象的方法newInstance 调

java基础-main方法详解

/* 主函数(主方法) * 1.public (访问修饰符,公共的)代表该类或者该函数访问权限是最大的 * 2.static 代表主函数随着类的加载就已经粗在了 * 3.void 代表主函数没有具体的返回值 * 4.main main不是一个java关键字,他是一个特殊的单词,他能够被jvm(java虚拟机)所识别 * 5.string[] args函数的参数是一个字符串数组,该数组的元素是字符串 * */ public class A6_38 { public static void main