java异常及错误处理大纲

文章目录

    • 1.异常处理
    • 2. 自定义异常
    • 3. 断言及程序的测试
    • 4. 程序的调试

1.异常处理

异常(exception ) 又称为例外、差错、违例
对应着Java运行错误处理机制
基本写法

try{ 语句组 
}catch(Exception ex){ 异常处理语句组;  
}
import java.io.*;
public class ExceptionForNum 
{public static void main(String[] args) {try{BufferedReader in = new BufferedReader(new InputStreamReader( System.in ) );System.out.print("Please input a number: ");String s = in.readLine();int n = Integer.parseInt( s );}catch(IOException ex){ex.printStackTrace();}catch(NumberFormatException ex){ex.printStackTrace();}}
}

传统的 语言如何处理

在一些传统的语言(如C语言中)
if语句来判断是否出现了例外
全程变量ErrNo

但这有几个缺点
正常处理与异常处理的代码同样处理
可读性(readability)差

每次调用一个方法时都进行错误检查
​ 可维护性( maintainability )差

​ 错误由谁处理不请
​ 职责不清

Java中处理异常
抛出(throw)异常
运行时系统在调用栈中查找
​ 从生成异常的方法开始进行回溯,直到找到:
​ 捕获(catch) 异常的代码

相关的语句
抛出异常

throw 异常对象;

捕获异常

 try{ 语句组}catch(异常类名 异常形式参数名){ 异常处理语句组;}catch(异常类名 异常形式参数名){ 异常处理语句组; }finally{ 异常处理语句组; }

其中,catch语句可以0至多个,可以没有finally语句

异常的分类

Throwable (可抛出)
Error: JVM的错误
Exception: 异常
一般所说的异常
是指Exception及其子类

Exception类

构造方法
public Exception();
public Exception(String message);
Exception(String message, Throwable cause) ;
​ 方法
​ getMessage()
​ getCause()
​ printStackTrace()

多异常的处理
子类异常要排在父类异常的前面

finally语句
无论是否有异常都要执行
即使其中有break,return等语句
在编译时,finally部分代码生成了多遍

package ch5;public class text1 {public static String output = "";public static void foo(int i) {try {if (i == 1) {throw new Exception();}output += "1";} catch(Exception e) {output += "2";return;} finally {output += "3";}output += "4";}public static void main(String args[]) {//foo(0);//System.out.print(output + " ");foo(1);System.out.println(output);}
}
//最后结果是23这说明,不管之前catch里是什么语句,都会执行finally语句

Exception分两种
RuntimeException及其子类,可以不明确处理
否则,称为受检的异常(checked Exception)

受检的异常,要求明确进行语法处理
要么捕(catch)
要么抛(throws):在方法的签名后面用throws xxxx来声明

在子类中,如果要覆盖父类的一个方法,若父类中的方法声明了 throws异常,则子类的方法也可以throws异常
可以抛出子类异常(更具体的异常),但不能抛出更一般的异常

package ch5;import java.io.FileInputStream;
import java.io.IOException;
public class text1{public static void main(String[] args){try{System.out.println("====Before====");readFile();System.out.println("====After====");}catch(IOException e){ System.out.println(e); }}public static void readFile()throws IOException {FileInputStream in=new FileInputStream("myfile.txt");int b;	b = in.read();while(b!= -1)   {System.out.print((char)b);b = in.read();}in.close();	}
}

try…with…resource

try(类型 变量名 = new 类型() ){
。。。
}
自动添加了finally{ 变量.close(); }
不论是否出现异常,都会执行

package ch5;import java.io.*;
class TryWithResourcesTest {public static void main(String ... args)throws IOException{String path = "c:\\aaa.txt";System.out.println( ReadOneLine1( path ) );System.out.println( ReadOneLine2( path ) );}static String ReadOneLine1(String path){BufferedReader br=null;try {br=new BufferedReader(new FileReader(path));return br.readLine();} catch(IOException e) {e.printStackTrace();} finally {if(br!=null){try{ br.close();}catch(IOException ex){}}}return null;}static String ReadOneLine2(String path)throws IOException{try(BufferedReader br= new BufferedReader(new FileReader(path))){return br.readLine();}}
}

2. 自定义异常

创建用户自定义异常类
创建用户自定义异常时
(1) 继承自Exception类或某个子Exception类
(2) 定义属性和方法,或重载父类的方法
重抛异常及异常链接
对于异常,不仅要进行捕获处理,有时候还需要将此异常进一步传递给调用者,以 便让调用者也能感受到这种异常。这时可以在catch语句块或finally语句块中采取 以下三种方式:
(1)将当前捕获的异常再次抛出:
throw e;

(2)重新生成一个异常,并抛出,如:
throw new Exception(“some message”);
(3)重新生成并抛出一个新异常,该异常中包含了当前异常的信息,如:
throw new Exception(“some message”,e);
可用e.getCause() 来得到内部异常

public class ExceptionCause {public static void main(String [] args)	{try {BankATM.GetBalanceInfo( 12345L);}catch(Exception e)	{System.out.println("something wrong�� " + e);System.out.println("cause��" + e.getCause());}}
}class DataHouse {public static void FindData( long ID)throws DataHouseException{if( ID>0 && ID<1000)System.out.println( "id: " + ID );elsethrow new DataHouseException("cannot find the id");}
}
class BankATM{public static void GetBalanceInfo( long  ID)throws MyAppException{try {DataHouse.FindData(ID);}catch (DataHouseException e) {throw new MyAppException("invalid id",e);}}
}
class DataHouseException extends Exception {public DataHouseException( String message ) {super(message);}
}
class MyAppException extends Exception {public MyAppException (String message){ super (message); }public MyAppException (String message, Exception cause) {super(message,cause);}   
}

3. 断言及程序的测试

断言(assertion)
assert的格式是:
assert 表达式; (逻辑表达式)
assert 表达式 : 信息;
在调试程序时
如果表达式不为true,则程序会产生异常,并输出相关的错误信息

class Assertion {public static void main(String[] args)	{assert hypotenuse(3,4)==5 : "算法不正确";}static double hypotenuse( double x, double y ){return Math.sqrt( x*x + y*y + 1);}
}

Assert 的编译及运行
编译
只有在JDK1.4及以上的版本中才可以使用断言。
具体地说,在早期的JDK版本(1.4)中编译时,要通过-source选项来指明版本,如:
javac -deprecation -source 1.4 -classpath . Assertion.java
运行
在运行时,要使assert起作用,则在java命令中,使用选项(-ea,即-enableassertions)。如:
java -ea -classpath . Assertion

程序的测试及 JUnit
程序的修改是经常要进行的过程,必须保证程序在修改后其结果仍然 是正确的。
在编写程序代码的同时,还编写测试代码来判断这些程序是否正确。
这个过程称为“测试驱动”的开发过程。
从而保证了代码的质量,减少了后期的查错与调试的时间,所以实际 上它提高了程序的开发效率。

JUnit
在Java的测试过程,经常使用JUnit框架
参见http://www.junit.org。
现在大多数Java集成开发工具都提供了对JUnit的支持。
在Eclipse中
项目右键—New— Junit Test Case
项目右键—Run as — Junit Test
测试通过则为绿色,不通过显示红色
在NetBeans中
项目右键—新建— Junit测试
运行—测试,或者直接按Alt+F6即可

测试函数
@Test来标注测试函数
在测试中常用的语句如下:
fail( 信息 ); //表示程序出错
assertEqauls(参数1,参数2 ); //表示程序要保证两个参数要相等
assertNull(参数); //表示参数要为null

     @Test public void testSum2() { HelloWorld a = new HelloWorld();  assertEquals(a.sum(0, 100), 100); // fail("Not yet implemented"); }

4. 程序的调试

程序中的错误
程序中的错误通常可以分成三大类
语法错误(Syntax error)
编辑、编译器发现
运行错误(Runtime error)
异常处理机制
逻辑错误(Logic error)
调试(debug) 、单元测试(unit test)

程序的调试(debug)
在IDE中,项目上点右键 ,debug as…
进入到调试视图(debug perspective)

调试的三种手段
断点 (breakpoint)
跟踪 (trace)
监视 (watch)

断点
切换断点(toggle breakpoint )
用鼠标单击(或右击)编辑器左边条
或者
Eclipse Ctrl+Shift+B
NetBeans Ctrl+F8

跟踪

EclipseNetBeans
逐语句执行F5F7
逐过程执行F6F8
跳出函数F7Ctrl+F7
运行到光标处Ctrl+RF4

监视

即时监视
鼠标指向变量

快速监视
点右键,Inspector

添加监视
点右键,Watch

还可以看:调用堆栈等等

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

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

相关文章

linux dev alloc name,深入理解Linux网络技术内幕-设备注册和初始化(二)

NIC注册和注销的通用架构Linux系统中NIC网络设备驱动程序利用网络代码进行注册和注销有其通用的架构&#xff0c;这里以PCI Ethernet NIC为例&#xff0c;其他设备类型只是所以函数名称和调用方式不同&#xff0c;主要依据于设备总线提供的接口。其中(a)为设备注册的大致流程图…

外贸常用术语_外贸中常用的会计术语及付款方式术语 | 会计英语

点击上面“财经英语”关注公众号&#xff01;点击下面小程序加入: 学习圈财经英语 学习圈 预付现金 Cash advance 凭提货单支付现金 Cash against Bill of Lading (B/L) 凭单据付现款||凭装货单付现款 Cash against Documents 现金结存||现金差额 Cash balance 现收现付制||现金…

c语言中block做函数参数,c语言中的block

//block块(数据类型) 封装的一段具有特定功能的代码段//函数有函数名&#xff0c;block没有名字&#xff0c;也可以叫做匿名函数&#xff1b;函数不能做参数传递&#xff0c;block可以作为参数传递&#xff1b;//形式&#xff1a;/* 返回值类型,(^ block变量名)(参数列表)&…

python 多维list 排序_一行代码的优雅| Python列表生成式

欢迎回来&#xff0c;上一周我们整理了基础课中三大结构有关内容的具体应用及案例。可以通过以下几篇推文进行回溯&#xff1a;Python语言基础50课我的Python - 100天笔记 |D1-D7我的Python - 100天笔记 |D8-D14列表是Python中非常常见的数据结构&#xff0c;在基础课中也占了不…

c语言高斯白序列x,C语言程序设计程设计指导书(晓庄).doc

C语言程序设计程设计指导书(晓庄)C语言程序设计课程设计任务书南京晓庄学院数学与信息技术学院2011-9-20一、C语言程序设计课程设计的目的说明1)复习巩固C语言的基础知识&#xff0c;进一步加深对C语言编程的理解和掌握&#xff1b;2)利用所学知识&#xff0c;理论和实际结合锻…

arduino智能风扇系统

研究方法与思路&#xff1a; 我们小组一开始找的是一个别人做好的项目&#xff0c;按键控制风扇挡位&#xff0c;不同挡位对应不同LED灯。但是实现过程中存在bug。而且仅仅通过按键控制风扇着实有局限性&#xff0c;因此我觉定用串口控制风扇开关的模式&#xff0c;输入1&…

verilog 生成块_如何高效的编写Verilog——终极版

为了高效的编写Verilog&#xff0c;通常有些编辑器插件可以自动生成代码&#xff0c;比如自动端口定义&#xff0c;自动连线&#xff0c;自动实例化等等。公司的环境有很好用的自动化插件&#xff0c;想给自己的电脑也整个怎么做。比如Emacs中有个插件叫verilog-mode。但是博主…

arduino串口输入改变模式模块

最新更新: 当时太嫩&#xff0c;做这个不知道arduino还有中断的方法&#xff0c;利用中断的方法可以比下面这种循环判断的方法更简单。 最近做了不少arduino智能系统&#xff0c;我发现在与用户交互的过程中&#xff0c;经常用到&#xff1a;通过在串口输入不同的值达到手动控…

android悬浮动态权限,Android 获取判断是否有悬浮窗权限的方法

现在很多应用都会用到悬浮窗&#xff0c;很多国产rom把悬浮窗权限加入控制了&#xff0c;你就需要判断是否有悬浮窗权限&#xff0c;然后做对应操作。Android 原生有自带权限管理的&#xff0c;只是被隐藏了。看android源码在android.app下就有个AppOpsManager类。类说明如下&a…

剩余 大小 查看内存_JVM的内存分配策略以及进入分代的条件

JVM的参数和知识点太多啦&#xff0c;记录下来&#xff0c;供自己随时回顾。java对象什么时候进入年轻代&#xff08;新生代&#xff09;&#xff1f;java对象什么时候进入老年代&#xff1f;对象优先在Eden分配大对象直接进入老年代空间分配担保机制java对象什么时候进入年轻代…

Arduino的串口结束符及串口缓冲区

文章目录1.深入理解缓冲区和Serial.available()&#xff1a;2.深入理解串口结束符3.验证结论&#xff1a;1.深入理解缓冲区和Serial.available()&#xff1a; 运行下面的代码&#xff0c;我发现如果不在串口输入任何数字&#xff0c;就会一直显示“no”&#xff0c;输入一个数…

android 圆角边框边框渐变,支持边框、圆角、渐变色、透明度的GradientButton

最近在项目中发现好多Button背景颜色相同&#xff0c;但圆角大小不等的Button&#xff0c;这样就得写一大堆的shape或者selector&#xff0c;不便于管理及后期维护&#xff0c;于是乎变想能不能写一个支持边框、圆角、渐变色、透明度的万用Button呢。为了能够兼容button自带的属…

(斜率,点和线段)zzuli1196数星星(二)

题目描述 一天&#xff0c;小明坐在院子里数星星&#xff0c;Gardon就出了个难题给他&#xff0c;让他数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了&#xff0c;小明马上就看花了眼&#xff0c;你能写个程序来帮他计算么&#xff1f; 输入 首先输入一个整…

鸿蒙ide如何运行,深入浅析华为鸿蒙IDE安装与Hello World

一、系统安装1. 到官网下载HUAWEI DevEco Studio2. 安装二、创建项目创建项目目前还没有手机选项&#xff0c;所以我先选择一个电视&#xff1a;IDE的环境看起来和idea差不多&#xff0c;应该比较容易上手。从“关于”里也可以看到&#xff0c;确实是基于IDEA开源版本开发的。我…

springboot 上传文件解析入库_SpringBoot + easyexcel + WebUploader 实现文件上传并解析

1. WebUploader的使用&#xff0c;引入css和js&#xff0c;css其实没什么用&#xff1a;2. 定义上传框&#xff1a;选择文件开始上传3.相关jquery&#xff1a;// 文件上传jQuery(function() {var $ jQuery,$list $(#thelist),$btn $(#ctlBtn),state pending,uploader;uploa…

中快捷搜索_同事用1分钟,我用半小时,原来是因为这8个Word快捷键,秒杀一切办公技巧...

同事用1分钟&#xff0c;我用半小时&#xff0c;这8个Word快捷键&#xff0c;秒杀一切办公技巧​mp.weixin.qq.com文&#xff5c;王羽卒今天给小伙伴们分享几个实用又有效的快捷键&#xff0c;帮助快速完成工作&#xff0c;同事用了半小时&#xff0c;你1分钟就能解决哟&#x…

动态规划理论基础

(采用维特根斯坦的表述方式) 1.达成目的过程可以由不同阶段组成 2.阶段由达成目的的条件确定 (注&#xff1a;规定每一次走一步&#xff0c;第一步就是一个阶段) 3.每个阶段由不同的状态组成 4.状态是阶段中可能面临的所有情况 (注&#xff1a;第一步落脚点可能有多个&am…

荣耀x10max能不能升级为鸿蒙,荣耀终于放出大招!4部荣耀旗舰可升级鸿蒙,网友:终于等到了...

4月24~26日&#xff0c;华为将召开开发者大会&#xff0c;届时手机使用的鸿蒙系统将正式上线&#xff0c;华为和部分荣耀手机将会首先支持。其实&#xff0c;早在2月22日的华为Mate X2的发布会上&#xff0c;余承东就说过4月发布鸿蒙OS。华为并不想推出鸿蒙系统&#xff0c;如果…

android 7.0新增控件,自定义Android控件,封装Arcgis for Android测距测面积工具控件

控件的功能包括&#xff0c;测距、测面积、撤销、恢复、清除、完成六个功能。测距&#xff1a;在地图上绘制线段进行长度测量测面积&#xff1a;在地图上绘制一个面&#xff0c;进行面积测量撤销&#xff1a;撤销到上一步绘制&#xff0c;只能撤销未完成的测量恢复&#xff1a;…

cpython需要另外安装吗_在windows环境下安装和使用Python(CPython)

在windows环境下安装和使用Python(CPython)一、下载1.选择Python版本打开Windows版Python官网下载链接&#xff0c;选择Latest Python 3 Release - Python 3.8.3 。(推荐选择Python3.x&#xff0c;也可以选择其他版本)2.选择需要的Python类型在File中选择Windows x86-64 execut…