异常机制(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. 在DAYU200上实现OpenHarmony跳转拨号界面

    一.简介 日常生活中,打电话是最常见的交流方式之一,那么如何在OpenAtom OpenHarmony(简称"OpenHarmony")中进行电话服务相关的开发呢?今天我们可以一起 ...

  2. Drop 、Delete、Truncate的区别是什么

    Drop .Delete.Truncate 的区别是什么? DROP 删除表结构和数据,truncate 和 delete 只删除数据 truncate 操作,表和索引所占用的空间会恢复到初始大小:d ...

  3. 在python中实现二叉树

    二叉树设计 定义节点类 class Node: # 修改初始化方法 def init(self,value): self.value = value # 节点值 self.left = None # ...

  4. 粗心的小红qsnctfwp

    将原 apk 安装包后缀名修改为 zip 将其中的 classes3.dex 文件解压 使用 Notepad++ 或其他工具打开 classes3.dex,将第 2 行的 38 修改为 35 或 36 ...

  5. 新手的登录qsnctfwp

    打开登录界面 按要求以普通用户 user 的身份,通过密码 password 登录 使用 BurpSuite 拦截登录情况 在获取(GET)登录结果页面时,修改 Cookie 中的 username ...

  6. 面向切面编程AOP[一](java 代码详解)

    前言 说句实话,在工作中,使用的aop不是特别多,但是特别重要,一般是辅助程序,在现代开发者辅助程序相当重要,比如说我们需要打印一些log,但是我们不可能去卸载我们的业务程序中,因为这太..... 正 ...

  7. tensorflow的variable、variable_scope和get_variable的用法和区别

    在tensorflow中,可以使用tf.Variable来创建一个变量,也可以使用tf.get_variable来创建一个变量,但是在一个模型需要使用其他模型的变量时,tf.get_variable就 ...

  8. 《c#高级编程》第2章C#2.0中的更改(二)——匿名类型

    一.概念 C#中的匿名类型是一种特殊类型,可以在运行时动态创建一个对象,该对象可以包含多个属性,这些属性的名称和类型可以在创建时指定.相对于定义具体的类,匿名类型更加灵活和简洁. C#的匿名类型通常用 ...

  9. MAC上Cisco AnyConnect删除不干净,造成无法重新安装的解决办法

    1.问题 由于直接删除而不是正常卸载,导致文件残留,无法正常安装,并且软件不可用 2.解决 2.1 终端运行命令 pkgutil --pkgs|grep com.cisco 查看cisco残留的文件 ...

  10. Mac 上fiddler与charles 抓包https 小程序请求 内容

    为什么选择charles 之前讲过<wireshark使用教程及过滤语法总结--血泪史的汇聚>, 很强大,但是很难用. fiddler 很好用,之前mac 上面没有,现在有了 fiddle ...