Throwable:error+exception
异常类:
程序错误:
Error:Java虚拟机无法解决的严重问题,StackOverflowError和OOM
Exception:其它因编程错误或偶然的外在因素导致的一般性问题, 可以使
用针对性的代码进行处理。
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界
编译时异常 必须处置的异常
运行时异常java.lang.RuntimeException类及它的子类都是运行时异常。
解决办法:
一、遇到错误就终止程序的运行。
二、是由程序员在编写程序时, 就考虑到错误的检测、 错误消息的提示, 以及错误的处理
异常处理机制:
1.try-catch-finally
可以由几个catch组成,分别处理相应的异常。
2.throws + 异常类型,声明抛出异常
如果一个方法中的语句执行时可能生成某种异常, 但是并不能确定如何处理这
种异常, 则此方法应显示地声明抛出异常, 表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出异常的列表, throws后面的异常类型可以是方法中产生的异常类型, 也可以是它的父类。
public class Example7 4
public static void main(String args[]) (
int n=0,m=0,t=1000;
try{
m = Integer.parseInt("8888");
n = Integer.parseInt("ab89");//发生异常,转向ce
t = 7777; //t 没有机会被赋值
catch (NumberFormatException e) {
System.out.println("发生异常:"+e.getMessage());
}
System.out.println("n="+n+",m="+m+",t-"+t);
try{
System. out.println("故意抛出I/O异常! ");
throw new java.io.IOException("我是故意的"): //故意抛出异常
//System. out.printint("不输出语句肯定没有机会执行,必须注释,否则编译出错");
}
catch(iava.io.IOException e){
System. out.println("发生异常: "+e.getMessage());
}
}
- 手动抛出异常 用户自定义异常,throws关键字声明要产生的若干个异常
/**
* 自定义异常
* @author LENOVO
*
*/
public class ThisRuntimeException extends RuntimeException{
public ThisRuntimeException() {
super();
// TODO Auto-generated constructor stub
}
public ThisRuntimeException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
断言类
/**
* 断言的类
* @author LENOVO
*
*/
public class ThisAssection {
/**
* 自定义异常
* @param message
*/
public static void getThisRuntimeException(final String message)throws ThisRuntimeException{
throw new ThisRuntimeException(message);
}
/**
* 断言一个对象为空
* @param message 提示用户的信息
* @param obj 需要断言的对象
* @return Object 返回类型
* @throws ThisRuntimeException
*/
public static Object isObjectNull(final String message,Object obj) throws ThisRuntimeException{
if(obj!=null){
getThisRuntimeException(message);
}
return obj;
}
}
断言
断言语句在调试代码阶段非常有用
格式:
assert booleanException
assert booleanException;messageException
启动和关闭:
默认关闭,调试程序时用-ea开启
java -ea mainClasss
内部类:
一个类中定义另一个类
内部类与外部类区别
1.内部类可以调用外部内的成员变量和方法
2.内部类的类体中不可以声明类变量和类方法
3.内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象
匿名类:
与子类有关的匿名类:
直接使用一个类的子类的类体创建一个子类对象
匿名类特点:
- 可以继承父类的方法也可以重写父类的方法
- 匿名类一定是内部类
- 匿名类可以访问外嵌类的成员变量和方法,匿名类的类体中不可以声明static成员变量和方法。
- 匿名类是子类,但没有类名,所以在用匿名类创建对象时直接用父类构造方法。
和接口有关的匿名类
java允许直接用接口名和一个类体创建一个匿名对象。
new Computable(){
}
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须重写接口的全部方法。