spring-test dao空指针异常_014、Java异常机制

1.异常的概念和分类

异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。

在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。

异常的分析

public class Test{public static void main(String[] args) {int i=1/0;  //除数为0System.out.println(i);}
}

c780d570b77f3bd94170cca61ff9c52d.png

Java是采用面向对象的方式来处理异常的。处理过程:

1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。

2. 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

/*** 异常:程序在执行的过程出现的非正常情况,异常一旦发生必须进行处理,否则将导致程序中断执行。* Java中的异常分类:* java.lang.Throwable* --java.lang.Error:严重错误* --java.lang.Exception:异常(例外)* ---java.lang.RuntimeException:运行时异常(不需要显示捕获处理)* ----java.lang.ArithmeticException:算术异常(除零出现异常)* -----java.uitl.InputMismatchException:输入不 匹配异常* ----checked Exception:检查异常(必须显示捕获处理,否则无法通过编译)* java处理异常的机制:* 1.try...catch..finally*   try{*       //可能出现异常的代码;*   }catch(异常的类型 e){*       //异常处理*   }...*   }finally{*       //一定会被执行的代码*   }*2.throws...throw*/
import java.util.InputMismatchException;
import java.util.Scanner;public class Test1 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {System.out.println("请输入第一个数:");int num1 = scanner.nextInt();//java.uitl.InputMismatchException:输入不 匹配异常System.out.println("请输入第二个数:");int num2 = scanner.nextInt();//java.uitl.InputMismatchException:输入不 匹配异常int result = num1/num2;//java.lang.ArithmeticException:算术异常System.out.println("result="+result);}catch(ArithmeticException e) {System.out.println("除数不能为零!");e.printStackTrace();//打印堆栈跟踪信息}catch(InputMismatchException e) {System.out.println("输入不匹配,请输入数字!");e.printStackTrace();}System.out.println("程序正常结束!");}
}

343244c0c072e81c6e44256180ce65ae.png

异常分类

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception

Exception又分为RuntimeException:运行时异常、CheckedException:已检查异常

Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。

Exception:Exception是程序本身能够处理的异常,如:空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)等。

Java异常类的层次结构图

99efab0e8671f95007b3b28936c183ba.png

2.常见简单异常的解决方法

RuntimeException运行时异常

常见的运行时异常:RuntimeException

1.java.lang.ArithmeticException:算术异常

2.java.uitl.InputMismatchException:输入不 匹配异常

3.java.lang.NullPointerException:空指针异常

4.java.lang.ArrayIndexOutOfBoundsException:数组下标越界

5.java.lang.StringIndexOutOfBoundsException: 字符串下标越界

6.java.lang.ClassCastException:类型转换异常

7.java.lang.NumberFormatException:数字转换异常

Checked Exception检查时异常

1. IOException

2. FileNotFoundException

3. ClassNotFoundException

4. PassException

5. NullPointException

/*** 常见的运行时异常:RuntimeException* 1.java.lang.ArithmeticException:算术异常* 2.java.uitl.InputMismatchException:输入不 匹配异常* 3.java.lang.NullPointerException:空指针异常  **** 4.java.lang.ArrayIndexOutOfBoundsException:数组下标越界**** 5.java.lang.StringIndexOutOfBoundsException: 字符串下标越界 **** 6.java.lang.ClassCastException:类型转换异常 **** 7.java.lang.NumberFormatException:数字转换异常 ***** 日期:2019年7月*/
public class TestRuntimeException {public static void main(String[] args) {
//		//空指针异常
//		String str = null;
//		str.length();
//		//数组下标越界
//		int[] nums = new int[5];
//		System.out.println(nums[5]);
//		//字符串下标越界
//		String str2 = "hello";
//		System.out.println(str2.charAt(8));//类型转换异常
//		Animal animal = new Dog();
//		Cat cat =(Cat)animal;String str3 = "abc";int i =Integer.parseInt(str3);//Integer.parseInt(String str):将字符串转换为整数System.out.println(i);}
}
class Animal{
}
class Dog  extends Animal{
}
class Cat extends Animal{
}

72f4c479073438a71adbf0aff642d126.png
/*** 常见的运行时异常:RuntimeException* 1.java.lang.ArithmeticException:算术异常* 2.java.uitl.InputMismatchException:输入不 匹配异常* 3.java.lang.NullPointerException:空指针异常  **** 4.java.lang.ArrayIndexOutOfBoundsException:数组下标越界**** 5.java.lang.StringIndexOutOfBoundsException: 字符串下标越界 **** 6.java.lang.ClassCastException:类型转换异常 **** 7.java.lang.NumberFormatException:数字转换异常 **** ...* 如何避免异常:通过严谨的判断防止潜在的运行时异常发生。*/
public class TestRuntimeException2 {public static void main(String[] args) {//空指针异常String str = null;if(str!=null) {str.length();//空指针异常,试图访问空对象的属性或方法}//数组下标越界int[] nums = new int[5];int index = 5;if(index<nums.length) {System.out.println(nums[index]);}}
}

异常的处理方式有两种:使用“try/catch”捕获异常、使用“throws”声明异常。

3.异常处理方式之一__捕获异常

捕获异常是通过3个关键词来实现的:try-catch-finally。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行(catch语句可有多条;finally语句最多只能有一条,根据自己的需要可有可无)。

31347494c8b1e5a39e257b5c46410d3d.png

捕获异常关键字(try catch finally)

try-catch 组合

用try来执行,如果出现异常,系统抛出异常,可以通过catch来捕捉并处理它

一个try语句必须带有至少一个catch语句块或一个finally语句块

注意事项

当异常处理的代码执行结束以后,不会回到try语句去执行尚未执行的代码。

import java.util.Scanner;public class TestTryCatch {public static void main(String[] args) {Scanner input =new Scanner(System.in);try {System.out.println("请输入被除数:");int numA=input.nextInt();System.out.println("请输入除数:");int numB=input.nextInt();int result=numA/numB;System.out.println(numA+"/"+numB+"="+result);}catch(ArithmeticException e) {//ArithmeticException e = new InputMismatchException  不成功//catch(Exception e) {//相当于Exception e=new ArithmeticException()多态的表示形式,父类引用指向了子类    //ArithmeticException算术异常e.printStackTrace();}System.out.println("程序结束,谢谢您的使用");}
}

a771ceaf67e7b86f57a374833ceef21f.png

try-finally 组合

finally 是无论是否产生异常,都执行的代码,但是有一种情况 finally 不执行,即退出 Java 虚拟机。

import java.util.Scanner;public class TestTryFinally {public static void main(String[] args) {Scanner input =new Scanner(System.in);try {System.out.println("请输入被除数:");int numA=input.nextInt();System.out.println("请输入除数:");int numB=input.nextInt();int result=numA/numB;System.out.println(numA+"/"+numB+"="+result);//退出java虚拟机System.exit(0);}finally {System.out.println("finally中的代码");}}
}

2a794e1a7c15e17d3134bd820395f294.png

try-catch-finally 组合

程序首先执行可能发生异常的try语句块。如果try语句没有出现异常则执行完后跳至finally语句块执行;如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。

public class TestTryCatchFinally {public static void main(String[] args) {
//		//1.try..catch
//		try {
//			int result = 1/1;
//			System.out.println(result);
//		}catch(Exception e) {
//			e.printStackTrace();
//		}
//		//2.try...finally
//		try {
//			System.out.println("try中的代码..");
//			int result = 1/0;
//		}finally {
//			System.out.println("finally中的代码...");
//		}//3.try...catch...finallytry {System.out.println("try中的代码..");int result = 1/0;}catch(Exception e) {System.out.println("catch中的代码...");}finally {System.out.println("finally中的代码...");}}
}

51b589e217631a2318c07e90d524b11f.png

注意事项

1. 即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。

2. finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。

4.异常的处理方式之二:声明异常(throws子句)

声明异常的关键字 throws

方法名的后面,用于声明该方法可能会产生一个异常如果方法声明的是 Exception 类型的异常或者是 Checked Exception 异常,要求方法的调用处必须做处理。

(1)继续使用 throws 向上(方法的调用处)声明

(2)使用 try-catch-finally 进行处理

如果声明的是 RuntimeException 类型的异常,那么方法的调用处可处理可不处理。

继承关系中的声明异常

1) 父类的方法声明了 Exception 类型的异常,子类在重写方法时,可以声明也可以不声明。但是如果子类重写 后的方法使用super 关键字调用父类的方法,那么要求必须对异常进行处理。

2) 如果父类的方法没有异常,那么子类的方法如果一定会有 Exception 或 Checked 异常,要求子类必须自己使用 try-catch 处理,或者给父类方法加上异常的声明

3) 如果子类在重写父类的方法时,产生的异常是RuntimeException 异常时,那么可以不用处理

throw 抛出异常对象

在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们以手工做,也可以由 JRE 来实现,但是他们调用的都是 throw 子句。

throws 与 throw

(1)throws 用于声明方法可能会产生的异常类型

throw 手动抛出异常对象

(2) throws 写在方法名称后面

throw 用于写在方法里

import java.io.File;
import java.io.IOException;
/*** throws与throw* 通过throws声明异常:跟在方法声明的后边,用于告知方法的调用者该方法有可能存在异常。*      方法的调用者可以使用try...catch...finally捕获异常或者使用throws继续讲异常声明出去。* 通过throw抛出异常:放在方法的内部,用于抛出异常,经常与throws结合使用。* throws与throw区别* 1.位置不同:throws放在方法声明的后边,用于声明该方法可能出现的异常,throw放在方法的内部,用于抛出具体的异常对象。* 2.类型不同:throws后跟声明异常的是异常的类型,throw后根具体的异常对象。*/
public class TestThrows {public static void test()throws Exception{}public static void test2()throws Exception{File file = new File("D:/aa.txt");try {file.createNewFile();//创建文件IOException属于检查异常,必须进行处理才能通过编译。}catch(IOException e) {e.printStackTrace();throw e;//抛出异常,后边跟异常对象}}public static void main(String[] args) {/*throws Exception{*/
//		try {
//			test();
//		}catch(Exception e) {
//			e.printStackTrace();
//		}}}

5.自定义异常

1.在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。

2.自定义异常类只需从Exception类或者它的子类派生一个子类即可。

3.自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。

4.习惯上,自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。

自定义异常类

/*** 自定义异常:可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类* 实现步骤:* 1.编写一个类继承exception* 2.编写该类的构造方法,并在构造方法中调用父类(Exception)中的构造方法为消息赋值。* 3.可以通过getMessage()方法获取消息信息。*/
public class AgeException extends Exception{public AgeException(String message) {super(message);//调用父类的构造方法}
}

自定义异常类的使用

public class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) throws AgeException{if(age>0&&age<150) {this.age = age;}else {throw new AgeException("年龄必须在0-150之间");//年龄不符合要求,抛出异常}}@Overridepublic String toString() {return "person [name="+name+",age="+age+"]";}public static void main(String[] args) {Person person = new Person();person.setName("zhangsan");try {
//			person.setAge(20);person.setAge(-20);}catch(AgeException e) {System.out.println(e.getMessage());//获取消息信息//	e.printStackTrace();}System.out.println(person);}
}

48bfbe6d918ea01023a5146b1c30bb63.png

使用异常机制的建议

1.要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下。

2.处理异常不可以代替简单测试---只在异常情况下使用异常机制。

3.不要进行小粒度的异常处理---应该将整个任务包装在一个try语句块中。

4.异常往往在高层处理(先了解!后面做项目会说!) 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于奇异值分解(SVD)的图片压缩实践

文章目录1. 前言2. 原理简介2.1 SVD定义3. 实践代码4. 参考文献1. 前言 数字图片在计算机中是以矩阵形式存储的。所以可以通过矩阵理论和矩阵算法对数字图像进行分析和处理。本文通过对图片进行SVD压缩&#xff0c;对不同的参数下的压缩效果进行对比。 SVD概念可以参考&#…

执行文件异常报错:ImportError: attempted relative import with no known parent package

问题描述 1. 源代码中的导入代码&#xff1a; from ..utils.osutils import mkdir_if_missing #导入自己的 函数 from ..utils.serialization import write_json, read_json这个是将utils中的py文件导入到cuhk03中。但是报错&#xff01; 解决方法 1. 相对导入 其中上述…

待机、休眠、睡眠的区别和优缺点

Windows操作系统中很早就加入了待机、休眠等模式&#xff0c;而Windows Vista中更是新加入了一种叫做睡眠的模式&#xff0c;可是很多人还是习惯在不使用电脑的时候将其彻底关闭。其实充分利用这些模式&#xff0c;我们不仅可以节约电力消耗&#xff0c;还可以用尽可能短的时间…

LeetCode 508. 出现次数最多的子树元素和(递归)

1. 题目 给你一个二叉树的根结点&#xff0c;请你找出出现次数最多的子树元素和。 一个结点的「子树元素和」定义为以该结点为根的二叉树上所有结点的元素之和&#xff08;包括结点本身&#xff09;。 你需要返回出现次数最多的子树元素和。如果有多个元素出现的次数相同&…

知识图谱入门视频(一)

学习内容&#xff1a; 知识图谱导论 陈华钧 浙江大学计算机科学与技术学院 教授 小象学院 哔哩哔哩 第一章 【其实后面的方法学习只是一个框架式的学习&#xff0c;并不明白具体的操作】 1. 什么是知识图谱&#xff1f; 知识图谱是一个系统&#xff01; 从根据场景构建再到场…

onenetsim定位功能吗_经常玩手机的抓紧看看,原来手机键盘还隐藏4个实用功能,真实用...

可爱的人都关注我了&#xff0c;就差你了1在日常生活中&#xff0c;大家对手机的依赖性越来越大&#xff0c;不管走到哪&#xff0c;时时刻刻都拿着手机发信息。可是&#xff0c;用了这么久的手机&#xff0c;你真的会用手机键盘吗&#xff1f;你知道手机键盘上隐藏的小功能吗&…

程序模拟键盘鼠标操作

用代码模拟键盘鼠标操作,主要用到keybd_event/mouse_event或者SendInput API函数.使用示例如下(附注释): /** 模拟键盘输入,以按窗口键(WIN键)为例 *///keybd_event模拟键盘输入示例::keybd_event( VK_LWIN, 0, 0, 0); //按下WIN键 ::keybd_event( VK_LW…

LeetCode 520. 检测大写字母

1. 题目 给定一个单词&#xff0c;你需要判断单词的大写使用是否正确。 我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如"USA"。 单词中所有字母都不是大写&#xff0c;比如"leetcode&qu…

不同电脑 命名管道_电脑键盘上的F1到F12,这些键都有哪些用处?用了5年总算明白了...

电脑键盘上的F1到F12&#xff0c;这些键都有哪些用处&#xff0c;用了5年总算明白了经常使用电脑的朋友会发现&#xff0c;电脑键盘上有一排F开头的键。那么这些键到底有什么用处呢&#xff1f;下面我们一起来了解一下。首先这些键都属于快捷键&#xff0c;所以每个键都有不同的…

知识图谱入门视频(二)

学习内容 小象学院 b站 第二章 【其实后面的方法学习只是一个框架式的学习&#xff0c;并不明白具体的操作】 第二部 典型知识库项目简介 CYC&#xff08;读音&#xff1a; 赛克&#xff09; CYC&#xff1a; 1984年由Douglas Lenat开始创建&#xff0c;最初的目标是建立人类…

InterDev 调试错误信息: Unable to set server into correct debugging state automatically....的解决办法...

InterDev 调试错误信息: Unable to set server into correct debugging state automatically....权威解决方法了&#xff1a;1、安装 vs6.0 cd2 vid_ss/setup.exe 2、安装 vs6.0 cd2 vid_ss/setup.exe3、配置dcom&#xff0c;设置用户权限4、打开IIS的调试功能5、OK详情见微软…

LeetCode 521. 最长特殊序列 Ⅰ

1. 题目 给你两个字符串&#xff0c;请你从这两个字符串中找出最长的特殊序列。 「最长特殊序列」定义如下&#xff1a;该序列为某字符串独有的最长子序列&#xff08;即不能是其他字符串的子序列&#xff09;。 子序列 可以通过删去字符串中的某些字符实现&#xff0c;但不…

wordpress acf字段 不同样式_提升wordpress执行效率二次开发实录

wordpress 对分类增加广告配置功能 wp_terms 增加admaster字段 varchar 200 wp-admin/edit-tag-form.php 小资料&#xff1a; wordpress wp_terms分类表 wp_term_taxonomy分类类型表、wp_term_relationships分类关联表 这三个表单相互关联 wordpress优化效率 当wordpress执行…

知识图谱入门知识(一)知识图谱应用以及常用方法概述

学习内容 搜集各种博客&#xff0c;理解实体识别、关系分类、关系抽取、实体链指、知识推理等&#xff0c;并且总结各种分类中最常用的方法、思路。 由于自己刚刚接触知识图谱&#xff0c;对该领域的概念和方法的描述还不是很清楚&#xff0c;所以只是简单的列出框架和添加链接…

openMP学习笔记(一)

声明&#xff1a;欢迎任何人和组织转载本blog中文章&#xff0c;但必须标记文章原始链接和作者信息。 本文链接&#xff1a;http://blog.csdn.net/li_007/archive/2009/04/30/4139211.aspx 开拓进取的小乌龟------->CSDN点滴点点滴滴Blog 之前大概看了一下openMP&#xff0c…

LeetCode 532. 数组中的K-diff数对

1. 题目 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。 这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字&#xff0c;且两数之差的绝对值是 k. 示例 1: 输入: [3, 1, 4, 1, 5], k 2 输出: 2 解释: 数组中有两个 2-diff …

python随机生成六位数密码_python生成6位包含数字和字母的密码

初学python&#xff0c;简单敲了几行生成6位包含数字和字母密码的代码(我是在python 3上敲的)首先理清思路&#xff1a;1、包含数字和字母的六位口令共有36^6个2、将0-9和a-z合成一个字符串pwd,用pwd[0-35]表示所有数字和小写字母&#xff0c;即pwd[0]0,pwd[1]1…pwd[34]y,pwd[…

知识图谱入门视频(三)

学习内容 小象学院 b站 第三章 【其实后面的方法学习只是一个框架式的学习&#xff0c;并不明白具体的操作】 链接 问题&#xff1a; 知识图谱究竟是什么&#xff1f; 可以看看开放知识图谱 其实就是将我们的语言拆分转换为符号表达&#xff0c;之后经过机器学习来将离散式的…

博客新皮肤上市

原创&#xff1a;冰极峰 有朋友说原来的博客不好看&#xff0c;趁着五一节放假&#xff0c;花了点时间重新制作了一套样式&#xff0c;图片借用一个外国博客的图片。 样式全部基于自定义皮肤样式改写的。 说实话&#xff0c;改写博客园样式是一件比较痛苦的事情&#xff0c;你不…

python调用接口测试_Python接口测试实战2 - 使用Python发送请求

本节内容requests安装requests使用JSON类型解析requests库详解带安全认证的请求序言上节课我们学习了接口测试的理论&#xff0c;抓包工具及使用Postman手工测试各种接口&#xff0c;这节课我们主要讲解使用Python语言来发送接口请求&#xff0c;实现接口测试自动化。发送请求,…