java学习笔记(Core java)7 断言与异常

1.错误的原因:
输入错误 设备错误 物理限制 代码错误
2.异常分类
总:Throwable->Error
->Exception->IOException
->RuntimeException:
继承RuntimeException异常的异常包括:
错误的类型转换;
空指针
访问越界

不继承RuntimeException异常的异常包括:
试图打开一个不存在的文件
试图在文件尾部读取数据
试图根据给定的字符串查找CLASS对象,但这个对象并不存在

C++中两种异常:logic_error类 相当于RuntimeException表示程序中的逻辑错误
runtime_error类 相当于非RuntimeException异常。由于不可预测的原因所引发的异常的基类

3.声明以检查的异常:
public FileInputStream(String name) throws FileNotFountException
抛出异常的情况:
1)调用一个抛出已检查异常的方法
2)程序运行过程中发现错误,并且利用throw抛出一个已检察的异常(throw)
3)程序错误 抛出一个未检查异常
4)Java虚拟机在运行时库出现错误

在方法的首行应该声明方法有可能抛出的异常
任何代码都应有抛出异常的潜能,因此继承与Error的异常不需要声明出来
同样RuntimeException的异常也不应该声明出来,因为该类异常应该在代码中修改避免出现

如果子类方法覆盖了父类的对象,子类抛出的异常只能比超类抛出的异常更加特定,也就是说父类方法中声明检查的异常要比子类对象方法中的异常更加通用

5.抛出一个异常 throws new EOFException()
String readDate(Scanner in) throws EOFException
{
while(true)
{
if(in.hasNext())
{
if(n < len)
{
//String err = "抛出异常";//可以自定义抛出的字符串
//throw new EOFException(err);
throw new EOFException();
}
}
}
return;
}

C++: java只能抛出Throwsable子类对象。C++能抛出各种类的对象

6.定义一个异常类 需继承异常基类
class FileFormatException extens IOException
{
publuc FileFormatException() {}
publuc FileFormatException(String err) //重载构造函数可以打印错误信息
{
super(err);//超类Throwable的toString会打印错误信息
}
}

//////////////////////
java.lang.Throwable
Throwable()
Throwable(String message)
String getMessage() /获取Throwable对象的详细信息
//////////////////////

7.捕获异常信息
try{
...
}
catch(Exception e1)
{
...
e1.printStackTrace();//打印错误栈
}
catch(Exception e2)
{
...
e2.printStackTrace();//打印错误栈
}
catch(Exception e3)
{
...
e3.printStackTrace();//打印错误栈
}
//如果方法中的代码抛出了一个早catch中没有声明的异常类型,那么这个方法就会退出

8.再次抛出异常与异常链
1.在catch中再次抛出一个异常
2.包装异常链并获取原始异常原因
try{
...
}
catch(SQLException e)
{
Throwable se = new ServletException("database err");
se.initCause(e);
throw se;
}
当获取异常时,可以使用 Throwable e =se.getCause();重新获取异常原始原因

9.finally //跟C#一样
在finally只用return会有意想不到的结果 因为finally里面的返回值会覆盖try方法里的返回值

10.带资源的try
try(Resource res = ...)
{

}
无论是否发生异常,try退出时会自动调用res.close()方法

11.分析堆栈跟踪
printStackTrace();
getStackTrace();//返回一个StackTraceElement数组
该数组包括文件名,行号,类名,方法名

静态的Thread.getAllStackTrace();对所有线程栈进行跟踪

(原书 489页 Throwable api)

12.使用异常的技巧
1)异常处理不能代替简单的测试(耗费时间)
2).不要过分的细化异常
坏习惯:
for(i = 0; i < 100; i++)
{
try{
...
}catch(Exception e){
...
}
}
转变为:(上述例子太细化每个过程了)
try{
for(i = 0; i < 100; i++)
{
...
}
}catch(Exception e){
...
}
3)利用异常层次结构
不要只抛出RuntimeException异常。应该寻找更加适当的子类异常
不要只捕获Throwable异常。会是源码难以维护
4)不要压制异常
5)在检测错误时,“苛刻”要比放任更好
6)不要羞于传递异常
5)6)==》 利用异常链 早抛出,晚捕获,

13.assert断言(允许在测试期间插入检查语句,代码发布时,检测语句将会自动移走)
assert条件: assert条件:表达式

断言条件为flase时,将会抛出AssertionError异常
在第二种形式中,表达式将被传入AssertionError构造器中转换为一个消息字符串

例子: assert x>0 或者 assert x>0 : x; //x的值将传入AssertionError对象

C++: assert(x >= 0); 将自动打印失败条件
==》java: assert x > 0:"x > 0";

14。启用与禁用断言
15.java给出了三个系统处理错误的机制:抛出异常,日志,使用断言
使用断言的情况:
断言失败是致命的,不可恢复的错误
只用于开发测试阶段

断言api 原书(496页)

16.日志记录
17.调试技巧

时间: 2024-08-22 02:41:12

java学习笔记(Core java)7 断言与异常的相关文章

java学习笔记(Core Java) 6接口与内部类

接口(实现C++的多继承,同时避免了虚继承)深拷贝与浅拷贝内部类代理 一.接口与泛型接口:提供一组行为规范public interface Comparable<T>{ int compareTo(T other)}...int conpareTo<Employee other> //指定T 接口中所有的方法自动属于public所有的域自动为public staic 接口中的域自动声明为 public static final 继承接口的关键字:implements1.接口提供方法

java学习笔记(Core Java) 9 泛型

集合接口一.引言:接口与实现分离,使用队列举例//提供接口规范interface Queue{...}//具体实现class LinkedListQueue<E> impements Queue<E> {...}class CircularArrayQueue<E> impements Queue<E> {...} Queue<Customer> e = new LinkedListQueue<Customer> 二.迭代器1.集合类

java学习笔记(Core Java) 8 泛型

泛型一.定义一个泛型类public class Pair<T>{ private T _first; public Pair(T first) {this._first = first;} public T getfirst() {return _first;}}java中类型变量使用大写字母且比较短E:元素类型 K,V 表的关键字与值的类型 T(U/S)任意类型 泛型方法:要么返回类型是泛型,要么参数是泛型public static <T> getMiddle(T... a){

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

Java学习笔记(Java语言规范,API,JDK,IDE)

Java语言规范:java.sun.com/docs/books/jls 三个版本的API:J2SE J2EE J2ME 1. J2SE 客户端独立应用程序或者applet 2. J2EE 服务端应用程序 [Java Servlets&JavaServer Page] 3. J2ME 移动设备变成 JDK为Java开发提供一个开发环境(IDE) Java学习笔记(Java语言规范,API,JDK,IDE)

java学习笔记1——java环境的搭建

1.java的安装路径最好没有中文和空格,因为如果有中文或者空格,在以后的编译过程中很容易出现莫名其妙的错误 2.安装java的过程中,安装好jdk后弹出安装JRE的界面,此时不用继续安装直接退出即可,因为JDK包含JRE,就算再装JRE,也是与JDK中的JRE是一样的 3.java环境搭建的原因,是为了方便程序编译的时候可以直接在DOS命令中输入java相关的命令就可以直接调用,而不需要每次都要尽到java命令所在的目录,因为当你输入此命令时,windows会找两次,第一次在你输入的目录中寻找

Java学习笔记-7.Java IO流

一.输入/输出流 1.流:不同类型的输入.输出源    数据流:输入或输出的数据 Java数据流的所有接口和类都是在java.io包中定义的,因此应在程序开头加入 import java.io.* 2.流的分类: (1)从流的流动方向来看,可以将IO流分为输入流和输出流 输入流:数据信息从某个地方流向程序中 输出流:数据信息从程序中发送到某个目的地 (2)从流的数据处理单位来看,可以将IO流分为字节流和字符流 字节流:以字节方式处理的二进制数据 字符流:以字符方式处理的数据流(Java使用Uni

Java学习笔记-6.Java异常处理

一.异常简介 1.异常:程序在运行过程中有时会出现一些意外的情况导致程序退出的情况 2.一个异常是由一个对象来表示的,所有的异常都直接或间接地继承自Throwable接口 Throwable接口是类库java.lang包中的一个类,它派生出两个子类:Error 和 Exception (1)Error类主要用来描述一些Java运行时系统内部的错误或资源枯竭导致的错误,此类错误一般由系统进行处理,一般程序本身不需要捕获和处理 (2)Exception类分为RuntimeException异常 和

Java学习笔记-2.Java语言基础

一.命名规则 1.Java标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线(_)开始 首字符之后可以是任何字符的组合 关键字不能用作标识符 标识符是大小写敏感的 合法标识符举例:age.$salary._value.__1_value 非法标识符举例:123abc.-salary 2.注意: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hell

java学习笔记之java如何快速入门

什么是java? java是一种高级计算机语言,由SUN公司(现已经被Oracle公司收购)在1995年5月推出的一种可以编写跨平台的应用软件. SUN公司将java划分为三个技术平台 JavaSE--标准版,主要以开发普通桌面和商务应用程序.JavaSE是三个平台中的核心,它包括了java的核心类库,例如集合.IO.数据库连接以及网络编程等. JavaEE--企业版,为开发企业级应用程序提供解决方案.该平台用于开发.装配以及部署企业级应用程序,主要包括Servlet.Jsp.JavaBean.