异常机制(Exception)

异常指程序运行中出现的不期而至的各种状况

异常分类:

  • 检查性异常:用户输入错误引起的异常
  • 运行时异常:写的时候未报错,但一运行就会报错,
  • 错误(error):错误不是异常,而实脱离程序员控制的问题,错误在代码中通常被忽略。如:当栈溢出时,一个错误就发生了,但在编译时是检查不到的

异常体系结构

java把异常当作对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类

javaAPI中定义的异常分为2大类:错误(error)和异常(Exception)

Error:

  • Error类对象有java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
  • java虚拟机运行错误(Virtual MachineError),当JVM不再有执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,java虚拟机JVM一般会选择线程终止
  • 发生在虚拟机试图执行应用时发生的错误,如:类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况

Exception

  • 在Exception分支中有一个重要的子类RuntimeException(允许是异常)如:

捕获和抛出异常

异常处理的5个关键字

try catch finally throw(手动抛出异常) throws(方法抛出异常)

package com.exception;

public class Test {
public static void main(String[] args) {
int a=1;
int b=0;
//怎么捕获异常并返回一些信息
try {//打try后自动生成的代码块,try可以监控区域
//假设可以明显的判断下面第二行错误
if(b==0){//可以选择主动抛出异常throw
throw new ArithmeticException();//通过throw关键字new一个异常,主动抛出异常,但是这个主动抛出异常只在方法中使用,见Test3 }
new Test().a();
System.out.println(a/b);
}catch(Throwable e){//catch(ArithmeticException e){//catch捕获异常,ArithmeticException是异常的类型
System.out.println("程序出现异常,变量b不能为0");//可以写多个catch,捕获多个异常,层层递进,但根据图123大的要在下方,如throwable应在最下
}finally{//最后处理善后工作。程序出不出异常都会执行finally
System.out.println("finally");
}
//finally可以不要,try catch必须要有
}
//再写个方法a中调用b,b中调用a
public void a() {
b();
}
public void b(){
a(); }
}
===================================================
package com.exception; public class Test2 {
public static void main(String[] args) {
int a=1;
int b=0;
try {
System.out.println(a/b);//选中当前这行代码,ctrl alt+t 选try catch finally会自动生成trycatch语句
} catch (Exception e) {
e.printStackTrace();//打印错误的栈信息
} finally {
} }
}
==================================================
package com.exception; public class Test3 {
public static void main(String[] args) {
//调用下面的test方法
try {
new Test3().test(1,0);//直接使用匿名内部类.test,并传参数a=1,b=0
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
} }
//定义一个方法,在方法中使用主动抛出
//假设这个方法中处理不了这个异常,还可以直接往外抛(在方法上抛出异常)
public void test(int a,int b) throws ArithmeticException{//但是这样的话需要将其捕获
if(b==0) {
throw new ArithmeticException();//主动抛出异常一般在方法中使用
}
//System.out.println(a/b);方法体用不用无所谓
}
}
/*
package com.exception; public class Test3 {
public static void main(String[] args) {
//调用下面的test方法
new Test3().test(1,0);//直接使用匿名内部类.test,并传参数a=1,b=0 }
//定义一个方法,在方法中使用主动抛出
public void test(int a,int b){
if(b==0) {
throw new ArithmeticException();//主动抛出异常一般在方法中使用
}
//System.out.println(a/b);方法体用不用无所谓
}
}
*/

自定义异常

用的并不多,了解

使用java内置的异常类可以描述在编程时出现的大部分异常情况,除此外,用户还可以自定义异常,用户自定义异常只需要继承Exception类即可

自定义异常步骤:

  1. 创建自定义异常类
  2. 在方法中通过throw关键字抛出异常对象
  3. 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
  4. 在出现异常方法的调用使用者中捕获并处理异常
package com.exception.demo02;
//自定义的异常类
public class MyException extends Exception{
//传递数字>10就抛出异常
private int detail;
//构造器
public MyException(int a) {
this. detail=a;
}
//用toString打印上面的信息
//异常的打印信息
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
} package com.exception.demo02;
//写一个测试类,测试下刚写的异常
public class Test {
//要先写一个可能存在异常的方法
static void test(int a) throws MyException{
System.out.println("传递的参数为:"+a);
if (a>10){
throw new MyException(a);
/* try {
throw new MyException(a);//抛出,只写这一句会报错要么在下一行用捕获,要么用throws抛出
} catch (MyException e) {
e.printStackTrace();
}
*/ }
System.out.println("OK");
} public static void main(String[] args) {
try {
test(101);
} catch (MyException e) {
System.out.println("MyException=>"+e);
}
}
}



java学习之旅(day.12)的更多相关文章

  1. Java学习之旅开篇:运行机制及环境搭建

    在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...

  2. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  3. Java学习之旅基础知识篇:数组及引用类型内存分配

    在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...

  4. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  5. 第一篇,java学习之旅

    在java的这座殿堂中,我才刚刚推开了大门,就像是在岔路口找到了一条,走向前进java大门的路. 下面是一些java算法的问题 第一题: package project.model; import j ...

  6. Java学习之旅(一):探索extends

    鄙人为兴趣爱好,0基础入门学习Java,有些心得想法,记录于此,与君分享. 然毕竟新手,学识尚浅,错误之处,希望多多指正批评,也是对我最大的帮助! 前言:本篇文章,主要讨论在子类继承父类之后,一些继承 ...

  7. 我的java学习之旅--一些基础

    (因为我粗略学过C,C++,Python,了解过他们的一些语法,所以为了使得java的入门更为顺畅,便会忽略一些和C语法相类似的地方,着重点明一些java自己的特色之处.也减轻一下自己写文字的负担.) ...

  8. Java学习之旅(二):生病的狗1(逻辑推导)

    前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教. 中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧. 村子中有50个人,每人有一条狗.在这50条狗中有病狗(这种病 ...

  9. ASP.NET Core on K8S学习之旅(12)Ingress

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...

  10. java学习之旅

    jar文件其实就是一个压缩包,里面包含很多class文件(一个class文件是一个类的字节码).方便在网络上传输.可以规定版本号,更容易进行版本控制. var只能在方法内使用,不能用于定义成员变量. ...

随机推荐

  1. 报表格式太难?一文教你Excel融合分析

    Excel是我们最经常使用的处理报表工具了,尤其是金融行业更是需要天天和报表打交道.但是Excel有一个问题,如果面对的数据庞杂,则处理起来就会相当麻烦,当需要从多个数据源获取数据来制作一个报表时,这 ...

  2. Python队列----queue

    import queue # 官网文档:https://docs.python.org/3/library/queue.html a1 = queue.Queue() # 先进先出队列 a2 = qu ...

  3. Python生成唯一ID----UUID

    # UUID 生成唯一ID # uuid 是Python内置模块,主要有五种算法. import uuid # uuid1() 基于时间戳 a1 = uuid.uuid1() print('uuid1 ...

  4. 电脑开机时报错No Bootable Device找不到索引的解决方法

      本文介绍笔记本电脑出现No Bootable Device错误提示,且无法开机的多种解决办法. 1 问题产生   最近,笔记本电脑正在正常使用时,突然蓝屏,出现你的设备遇到问题,需要重启.的提示: ...

  5. 【4】Spring框架的起源

    在我们的<Java Spring框架入门教程>中对 Spring 框架进行了十分详尽的介绍和剖析,但在学习 Spring Boot 之前,在这里回顾一下 Spring 是怎么出现的. Sp ...

  6. 重新整理.net core 计1400篇[九] (.net core 中的依赖注入的服务的消费)

    前言 包含服务注册信息IServiceCollection 集合最终被用来创建作为依赖注入容器的IServiceProvider 对象. 当需要创建某个服务实例的时候(服务消费),我们通过指定服务类型 ...

  7. leetcode:655. 输出二叉树

    655. 输出二叉树 在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则: 1> 行数 m 应当等于给定二叉树的高度. 2> 列数 n 应当总是奇数. 3> 根节点的值(以 ...

  8. 力扣438(Java)-找到字符串中所有字母异位词(中等)

    题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括相同的字符串). 示例 1: ...

  9. 力扣448(java)-找到数组中所有消失的数(简单)

    题目: 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果. 示例 ...

  10. 百万TPS高吞吐、秒级低延迟,阿里​搜索离线平台如何实现?

    导读:阿里主搜(淘宝天猫搜索)是搜索离线平台非常重要的一个业务,具有数据量大.一对多的表很多.源表的总数多和热点数据等特性.对于将主搜这种逻辑复杂的大数据量应用迁移到搜索离线平台总是不缺少性能的挑战, ...