java学习之旅(day.12)
异常机制(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类即可
自定义异常步骤:
- 创建自定义异常类
- 在方法中通过throw关键字抛出异常对象
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
- 在出现异常方法的调用使用者中捕获并处理异常
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)的更多相关文章
- Java学习之旅开篇:运行机制及环境搭建
在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- Java学习之旅基础知识篇:数组及引用类型内存分配
在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
- 第一篇,java学习之旅
在java的这座殿堂中,我才刚刚推开了大门,就像是在岔路口找到了一条,走向前进java大门的路. 下面是一些java算法的问题 第一题: package project.model; import j ...
- Java学习之旅(一):探索extends
鄙人为兴趣爱好,0基础入门学习Java,有些心得想法,记录于此,与君分享. 然毕竟新手,学识尚浅,错误之处,希望多多指正批评,也是对我最大的帮助! 前言:本篇文章,主要讨论在子类继承父类之后,一些继承 ...
- 我的java学习之旅--一些基础
(因为我粗略学过C,C++,Python,了解过他们的一些语法,所以为了使得java的入门更为顺畅,便会忽略一些和C语法相类似的地方,着重点明一些java自己的特色之处.也减轻一下自己写文字的负担.) ...
- Java学习之旅(二):生病的狗1(逻辑推导)
前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教. 中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧. 村子中有50个人,每人有一条狗.在这50条狗中有病狗(这种病 ...
- ASP.NET Core on K8S学习之旅(12)Ingress
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...
- java学习之旅
jar文件其实就是一个压缩包,里面包含很多class文件(一个class文件是一个类的字节码).方便在网络上传输.可以规定版本号,更容易进行版本控制. var只能在方法内使用,不能用于定义成员变量. ...
随机推荐
- 使用 Debian、Docker 和 Nginx 部署 Web 应用
前言 本文将介绍基于 Debian 的系统上使用 Docker 和 Nginx 进行 Web 应用部署的过程.着重介绍了 Debian.Docker 和 Nginx 的安装和配置. 第 1 步:更新和 ...
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
目录 简介 Spring Boot的基本操作 Spring Boot的构建和部署 Spring Boot工具 Spring Boot的测试 Spring Boot中使用JPA Spring Boot和 ...
- Java 继承与多态:代码重用与灵活性的巧妙结合
Java 继承(子类和超类) 在 Java 中,可以从一个类继承属性和方法到另一个类.我们将"继承概念"分为两类: 子类(child): 从另一个类继承的类 超类(parent): ...
- C# Break 和 Continue 语句以及数组详解
C# Break 它被用于"跳出" switch 语句. break 语句也可用于跳出循环. 以下示例在 i 等于 4 时跳出循环: 示例: for (int i = 0; i & ...
- Spring 框架模块深度解析:核心容器、数据访问、Web 层与其他关键模块
Spring 可能成为您的所有企业应用程序的一站式商店.但是,Spring 是模块化的,允许您挑选适用于您的模块,而无需引入其他模块.下面的部分提供了 Spring Framework 中所有可用模块 ...
- Docker 学习之道: 容器注册表及其最佳实践
容器注册表是Docker容器镜像的集中存储和分发系统.它允许开发人员以这些镜像的形式轻松共享和部署应用程序.容器注册表在容器化应用程序的部署中发挥着关键作用,因为它们提供了一种快速.可靠和安全的方式, ...
- java延迟队列DelayQueue及底层优先队列PriorityQueue实现原理源码详解
DelayQueue是基于java中一个非常牛逼的队列PriorityQueue(优先队列),PriorityQueue是java1.5新加入的,当我看到Doug Lea大神的署名之后,我就知道这个队 ...
- django ORM 按月分组统计
一.搭建环境,准备数据 1.1:新建项目 django-admin startproject Test 1.2:新建app python manage.py startapp app 1.3:设置 s ...
- 填报表中也可以添加 html 事件
在实际的项目开发中,填报表的应用十分广泛. 多数情况下,填报表会作为整个项目的一部分配合需求灵活使用,但有时也会受大项目环境的影响,产生一些特别的要求.比如,通常报表单元格的数据类型大多是文本,有时却 ...
- SSM使用自定义ConditionalOnProperty实现按需加载spring bean
SSM使用自定义ConditionalOnProperty实现按需加载spring bean 背景: 公司提供的系统框架是SSM架构,SSM架构是没有springboot的ConditionalOnP ...