黑马程序员技术交流社区
标题:
异常
[打印本页]
作者:
trj1123131766
时间:
2015-8-7 23:48
标题:
异常
各位对异常有什么看法?本人觉得好像没什么意义.
作者:
一枚小小媛
时间:
2015-8-10 22:55
分享一点笔记给你。
/**
异常概述:
程序中会出现问题,Java 是完全面向对象的语言,将这些问题也进行了对象的封装.
这些问题在程序中出现,Java封装成了对象,由于问题比较多,就存在很多对象.这些对象统称为异常.
由于程序中会出现各种问题,存在各种对象,但是这些都有一些共性,都叫做异常,也就组成一个异常的体系.
异常体系:
java.lang.Throwable
Throwable 类是 Java 语言中所有错误或异常的超类。
public class Throwable extends Object implements Serializable
该类父类是Object 类,并且实现了Serializable(序列化)
该类没有被abstract 修饰->有可能可以创建对象.
该类没有被final 修饰->该类有可能有子类
该类有两个子类 Error (错误) Exception(异常)
|---Throwable 异常体系的顶层父类
|---Error 错误
NoClassDefFoundError 来加载失败, java 类名 JVM 根据类名加载字节码文件. 字节码文件存在.出现该问题.
了解.
该类还有子类,并且该类的子类大部分的后缀名都是Error ,表示错误,在程序中无法解决.
|---Exception 异常
程序中出现的问题. 编译出现问题,运行时候也可能出现问题...
如何查看一个现有的类怎么使用:
方案一: 直接查看源代码
方案二: 查看API文档说明. 有关于Java 内置类的详细的说明.
查看文档:
类的描述,是否是abstract 是否是final
如果是abstract 就不能创建对象了
如果是final 就不能有子类了.
查看构造函数:
如果构造函数非私有的,Java提供的构造函数一般都是public 的,
查看构造函数的参数类型
来决定,调用构造函数传递的实参.
查看方法:
一个方法就是一个独立的功能,找到了合适的方法,就可以方便解决问题.
Throwable 类的构造函数:
Throwable() 无参数构造
Throwable(String message) 有参数构造
Throwable 类提供的成员方法:
toString() 该方法返回一个字符串.
返回了一个Throwable 对象的描述.
重写父类Object 类中的toString 方法.
getMessage() 获取异常的信息
printStackTrace()
获取异常的栈信息,所有的相关的异常信息.
学习Sun 公司提供的类.
学习什么? 学习该类是否可以创建对象,该类提供什么功能,如何使用.
找到专业的对象,做专业的事情.
如果Sun 提供的类的内部的编写(实现)感兴趣,可以查看源代码.
*/
public class Demo1{
public static void main(String[] args){
//printArr();
//Throwable 创建对象.
Throwable th=new Throwable();
// 打印对象名 默认 : 类名@哈希码值
// 该对象仅仅打印了一个类名
System.out.println(th);
// toString 是父类Object 类中的方法. 子类肯定重写了该方法.
System.out.println(th.toString());
// 调用Throwable 类的有参数构造.创建对象. 通过有参数构造给Throwable 传递了异常的字符串形式的描述.
Throwable th1=new Throwable("头晕,恶心");
System.out.println(th1);
// 获取异常的描述.
System.out.println(th1.getMessage());
// 获取异常对象的所有的相关的异常信息
System.out.println(th1.printStackTrace());
// 自定义MyThrowable 类
MyThrowable myth1=new MyThrowable();
System.out.println(myth1);
System.out.println(myth1.toString());
// 自定义类提供了有参数构造,可以接收字符串形式的信息
MyThrowable myth2=new MyThrowable("头晕,恶心");
System.out.println(myth2);
// 获取信息
System.out.println(myth2.getMessage());
}
public static void printArr(){
int[] arr=new int[3];
System.out.println(arr[3]); // 程序运行中,会出现问题,JVM 将问题进行了对象的封装. 就是异常.
}
}
class MyThrowable{
private String message;
MyThrowable(){
}
MyThrowable(String mess){
this.message=mess;
}
public String getMessage(){
return this.message;
}
/**
重写父类toString方法
*/
public String toString(){
return "MyThrowable: "+this.message;
}
}
/**
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Demo1.printArr(Demo1.java:7)
at Demo1.main(Demo1.java:3)
Exception in thread "main" java.lang.NoClassDefFoundError
*/
复制代码
作者:
一枚小小媛
时间:
2015-8-10 22:57
异常的第一种处理方式: cry catch
public class Test2{
public static void main(String[] args){
System.out.println("程序启动");
//div(10,5);
div(10,0);
System.out.println("程序over");
}
/**
定义函数进行除法运算
该函数如果除数为0,程序无法正常工作... 直接出现异常对象,程序并提前结束.
解决问题:
需要即使出现了异常还可以正常的运行...
解决方案:
使用try catch 语句
*/
public static void div(int i,int j){
System.out.println("除法运算start...");
try{
int result=i/j; // 该行代码,程序有可能出现问题,当出现问题时,JVM 将问题进行了对象的封装,产生一个异常对象.
// 本例中是算术异常 ArithmeticException 如果出现异常程序员不处理,JVM 直接停止程序,并将异常的信息打印在控制台.
System.out.println(result);
}catch(ArithmeticException e){// 在catch 语句中可以捕获try 语句中产生的异常对象. 本质就是接受一个对象.
// 类类型 对象名
//具体的异常处理的解决方案...
System.out.println("你的数学是,英语老师教的吧...");
System.out.println(e.toString()); // 打印异常描述
System.out.println(e.getMessage());// 打印异常的信息
e.printStackTrace() ;// 打印出异常所有的相关信息
}
System.out.println("除法运算结束...");
}
}
public class Demo4{
public static void main(String[] args){
// Thread.sleep();// 使用try catch 处理异常.
for(int i=0;i<10;i++){
try{
Thread.sleep(200);
}catch(InterruptedException e){
System.out.println(e.toString());
}
System.out.println("hello");
}
}
}
复制代码
作者:
一枚小小媛
时间:
2015-8-10 22:58
异常的第二种处理方式 throws
/**
异常处理:
抛出处理
方法中如果有可能出现异常的语句.
使用 if 进行拦截,并使用throw 抛出一个异常对象.
方法中:
throw new 异常对象;
如果在方法中使用thow 抛出了异常对象,在方法上需要进行声明,告知方法的调用者,需要注意(函数的调用者需要处理)
方法上:
throws 异常类
可以跟多个异常类
可以使用多态机制,使用Exception
使用声明了异常的方法:
由于方法有异常需要处理;
一: 使用者继续抛出
二: 使用者try catch
初学者:
写程序时,注重程序的逻辑, 异常可以抛出处理. 代码只是为编译通过(跟没有处理异常时异常的) 没有太大的作用
但是逻辑实现后,应该使用try catch 进行更专业的处理. ->提供程序的健壮性...
*/
public class Test2{
public static void main(String[] args)throws Exception{
div(10,0);
Thread.sleep(100);
}
public static void div(int i,int j)throws Exception{
if(j==0){
throw new Exception("除数为0了"); // 使用throw 抛出了一个异常对象.
}
System.out.println(i/j);
}
}
复制代码
作者:
何时指点江山
时间:
2015-8-10 23:42
作为一个基础班的来说,看得我头好晕
作者:
两木三水
时间:
2015-8-10 23:51
很详细
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2