1.如何理解Exception,Error和Throwable
Throwable是Exception和Error的父类.
Error表示错误,一般是系统级的错误!
Exception一般是程序运行期间的错误!
通常在使用 try{}catch(Exception e){} 这种结构的时候,只能找到一半的错误,也就是说只能捕获Exception范围内的异常 并处理使得程序能够正常运行.而Error范围内的错误就无法捕获并处理.
通过 try{}catch(Throwable a){} 的方式能够处理,但是一般情况下不这样做。
原因在于查看Error下面的子类,VirtualMachineError,ThreadDeath,LinkageError,从名字上看出来这些错误都是非常非常严重的,到底是否需要去捕获或者处理呢?
Error的产生一般是JVM或者是操作系统的问题,JAVA 文档中对Error的说明是:"Error是Throwable的子类,它的出现说明出现了严重的问题。一般应用程序除非有理由,否则不应该捕捉Error,通常这是非常反常的情况".
Exception的产生主要是在程序运行期间发生的一些不正常事件中止了程序的运行,可以通过JAVA异常处理机制捕获异常并处理,使得程序正常运行下去。这些异常(不正常事件)有别于Error错误,它们通常是可修复的,程序员可以处理的。
2.运行时异常和受检查异常
1)运行时异常,属于RuntimeException类及子类范围的类(以及衍生类)都属于运行时异常。
2)受检查异常,在Exception范围内,除了运行时异常的类都是受检查异常类,为checked exception
3)它们之间的区别在于: 例如在代码中写了 throw new Exception(); 和 throw new RuntimeException();
两者都会在运行期间抛出异常!
但是在编译阶段前者的属于抛出一个受检查异常,要求对它进行显式的try..catch 捕获处理或者向上一层方法抛出,否则在编译期间就显示错误!
后者抛出是运行时异常,在编译阶段不予检查,语法上不会显示任何错误!
所以简单的通过throw手动抛出受检查异常 和抛出运行时异常,前者要求显式处理,后者不要求作出处理。
3.throw 和throws的区别
1)throw 是手动抛出异常,throw new **Exception(); 抛出的是某一个异常类型的实例.
2)throws 是方法抛出异常,写在方法声明处 public void show()throws **Exception,**Exception{} 紧跟throws后的是异常类型,而非异常实例,且可以声明抛出多个异常,同时这些异常类型大多都为 受检查异常类型。
3)throw 是程序员手动抛出异常,一般可用在某种流程控制,需要显示操作失误情况下可对外抛出异常,进入catch代码块,明示操作有误等。
throws 方法抛出异常,通常是告知调用此方法者,本方法有可能抛出一个异常,在调用时应当要进行异常监控。且因为throws方法抛出异常为受检查异常类型,这样就从语法上要求更需要对受检查异常类型作出捕获,或者再次向上抛出。
例如: JDBC中 public static Class forName(String className)throws ClassNotFoundException 加载驱动类时,调用此方法.
因为方法声明出 throws ClassNotFoundException 就告诉了方法调用者 本方法有可能会发生 ClassNotFoundException 异常,因为需要在调用此方法时格外注意。且此异常类型是受检查类型,那么在编译阶段就更要求用户调用时必须加上 try..catch(){}语句块,或者再次往上方法声明抛出 ClassNotFoundException 交由上层方法声明抛出 。
throws 方法抛出异常的两种处理方式
(1)try{
Class.forName("com.microsoft.....");
}catch(ClassNotFoundExceptioin e){
...
}
(2)
public Connection getConnection()throws ClassNotFoundException{
Class.forName("com.microsoft....");
}
如果把ClassNotFoundException 改为RuntimeException 就无需处理,那也就失去了方法抛出异常的意义了。
4.常见的运行时异常
ArithmaticExceptionDemo.java
/**
* 当除数为 0 时的异常 是运行时异常 编译时并不报错 只会在运行时发生
* @author Simon Lv
*
*/
public class ArithmaticExceptionDemo {
//计算两个数相除的结果
public int divide(int a,int b){
return a/b;
}
//抛出异常
//Exception in thread "main" java.lang.ArithmeticException: / by zero
public static void main(String args[]){
ArithmaticExceptionDemo excp = new ArithmaticExceptionDemo();
excp.divide(10,0);
}
}
ArrayStoreExceptionDemo.java
/**
* 演示 试图将一个错误的对象 存储到一个数组时发生的异常 ArrayStoreException
* @author Simon Lv
*
*/
public class ArrayStoreExceptionDemo {
//程序的入口
public static void main(String arsg[]){
//Object类型 字符串数组
Object x[] = new String[3];
//为了不让程序在编译时就检查报错 就故意写成上述类型
//如果写成 下面类型就会直接报错
//String x [] = new String[3];
try{
//错误的类型 java.lang.ArrayStoreException: java.lang.Integer
x[0] = new Integer(0);
}catch(ArrayStoreException ae){
System.err.println(ae.toString()+"ok");
ae.printStackTrace();
}
System.out.println("程序正常运行!");
}
}
ClassCastExceptionDemo.java
/**
* 类 类型装换异常 当试图将对象强制转换为不是实例的子类时,抛出该异常 ClassCastException
* @author Simon Lv
*
*/
public class ClassCastExceptionDemo {
public static void main(String args[]){
Object x = new Integer(12);
try{
System.out.println((String)x);
}catch(ClassCastException ce){
System.err.println(ce.toString());
}
}
}
EmptyStackExceptionDemo.java
import java.util.EmptyStackException;
import java.util.Stack;
/**
* 演示堆栈为空的异常 EmptyStackException
* @author Simon Lv
*
*/
public class EmptyStackExceptionDemo {
public static void main(String args[]){
Stack<String> s = new Stack<String>(); //栈
s.push("a"); //先压入 a 压栈 push()方法
s.push("b"); // b
s.push("c"); // 最后压入 c
try{
while(s.size()>0){
System.out.println( s.pop()); //依次循环将栈中的元素弹出 pop()方法
}
s.pop(); // 此动作将造成异常,因为栈中所有元素在上面的 循环中就已经弹出,为空栈
}catch(EmptyStackException ee){
System.err.println(ee.toString());
ee.printStackTrace();
}
}
}
IndexOutOfBoundsExceptionDemo.java
/**
* 演示 IndexOutOfBoundsException 异常
* 指某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
* @author Simon Lv
*
*/
public class IndexOutOfBoundsExceptionDemo {
public static void main(String args[]){
int num [] = new int[10];
try{
//数组10个长度 12次循环就报错
for(int i=0;i<12;i++){
System.out.println(num[i]); //循环超出范围
}
}catch(IndexOutOfBoundsException ie){
System.err.println(ie.toString());
ie.printStackTrace();
System.out.println( ie.getCause());
System.err.println(ie.getMessage());
}
System.out.println("程序还 能继续执行");
}
}
NegativeArraySizeExceptionDemo.java
/**
* 演示 NegativeArraySizeException 异常
* 如果应用程序试图创建大小为负的数组,则抛出该异常。
* @author Simon Lv
*
*/
public class NegativeArraySizeExceptionDemo {
public static void main(String args[]){
try{
int num [] = new int [-9]; //创建大小为负的数组,则抛出该异常。
System.out.println(num[0]);
}catch(NegativeArraySizeException ne){
System.err.println(ne.toString()); //err红色打印
ne.printStackTrace();
}
}
}
NullPointerExceptionDemo.java
/**
* 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
调用 null 对象的实例方法。
访问或修改 null 对象的字段。
将 null 作为一个数组,获得其长度
将 null 作为一个数组,访问或修改
将 null 作为 Throwable 值抛出
应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用
* @author Simon Lv
*
*/
public class NullPointerExceptionDemo {
String nameString; //类字符串成员变量 默认为null
public static void main(String args[]){
try{
//返回字符串第一个字符 但将出现异常 相当于 null.charAt(0);
char c = new NullPointerExceptionDemo().nameString.charAt(0);
System.out.println(c);
}catch(NullPointerException ne){
System.err.println(ne.toString());
ne.printStackTrace();
}
}
}
NumberFormatExceptionDemo.java
/**
* 演示格式转换异常 NumberFormatException
* 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常
* @author Simon Lv
*
*/
public class NumberFormatExceptionDemo {
public static void main(String args[]){
String a = "3";
int b = (int)new Integer(a);
System.out.println(b);//这个是没有问题的
try{
String c = "aa";
//java.lang.NumberFormatException: For input string: "aa"
int d = (int)new Integer(c);
System.out.println(d);//这个是有问题的
}catch(NumberFormatException ne){
System.err.println(ne.toString());
ne.printStackTrace();
}
}
}
分享到:
相关推荐
Java 异常处理通过 5 个关键字 try、catch、throw、throws、finally 进行管理。基本过程是用 try 语句块包住要监视的语句,如果在 try 语句块内出现异常,则异常会被抛出,你的代码在 catch 语句块中可以捕获到这个...
Java 异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。 Java 异常处理的基本语法是: try{ //(尝试运行的)程序代码 }catch(异常类型 异常的变量名){ //异常处理代码 }finally{ //...
Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。 Error(错误)是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。这种错误一般表示代码运行时 JVM ...
Java异常架构主要包括Throwable、Error和Exception三个部分。 1. Throwable:是Java语言中所有错误与异常的超类。Throwable包含两个子类:Error(错误)和Exception(异常),它们通常用于指示发生了异常情况。 2....
Java异常架构包括Throwable、Error和Exception三个部分。Throwable是Java语言中所有错误与异常的超类,包含两个子类:Error(错误)和Exception(异常)。Error定义了一些运行时的错误,例如VirtualMachineError、...
Java异常处理是编程中至关重要的一个环节,它关乎程序的健壮性和稳定性。在Java中,异常(Exception)被用来表示程序运行时发生的错误或不正常情况。异常并不等同于错误,它是程序设计的一部分,允许我们优雅地处理...
Java异常处理由五个关键字组成:`try`, `catch`, `finally`, `throw`, 和 `throws`。 - `try` 块包含可能抛出异常的代码。 - `catch` 块用于捕获并处理特定类型的异常。 - `finally` 块确保无论是否发生异常,...
`Throwable`是Java异常体系的基础,它提供了表示错误和异常的基本结构。 ### 1. `Throwable`类 `Throwable`类是所有异常和错误的基类,它有两个主要的子类:`Exception`和`Error`。`Exception`是程序中通常会遇到...
Java异常处理通过五个关键字来实现:`try`、`catch`、`finally`、`throw`和`throws`。`try`块用于包含可能会抛出异常的代码,`catch`块用于捕获并处理异常,`finally`块确保在任何情况下都会执行的代码,无论是否...
Java异常处理是编程过程中的重要环节,它有助于增强程序的健壮性和稳定性。在这个全面的教程中,我们将深入探讨Java异常的基本概念、分类、处理机制以及最佳实践。 首先,Java异常是程序运行时发生的错误,它中断了...
`Throwable`类有两个主要的子类:`Error`和`Exception`。 - **Error**:通常用于指示系统级错误,这类错误往往是程序无法处理的(例如,虚拟机错误),因此不应该被程序捕获。 - **Exception**:代表可以被程序捕获...
Java的异常类都继承自`java.lang.Throwable`,主要分为两种类型:Error和Exception。Error是系统级的错误,如虚拟机错误、内存不足等,一般开发者无法处理,而Exception是应用程序可以预见并处理的异常。 声明异常...
Java异常处理有五个关键字:`try`、`catch`、`finally`、`throw`和`throws`。`try`块用于包含可能会抛出异常的代码,如果在`try`块中出现异常,控制流将立即转移到与之匹配的`catch`块。`catch`块用于捕获并处理特定...
Java异常处理的核心在于五个关键字:try、catch、finally、throw和throws。这些关键字帮助程序员构建了一个框架,当程序遇到预期或未预期的问题时,能够妥善地响应。 1. **try**:try块是异常处理的起点,它包含...
在本文中,我们将详细介绍 Java 异常处理机制,包括 try、catch、finally 块、throws、throw 关键字、Exception 和 Error 类、Checked Exception 和 Unchecked Exception 等概念,并提供了多种异常处理的示例代码,...
Java异常主要分为两大类:Error和Exception。Error是系统级错误,通常由JVM(Java虚拟机)报告,如内存溢出、线程死锁等,程序员通常无法直接处理。Exception则分为检查异常(Checked Exception)和运行时异常...
其中,Throwable 是 Java 异常的祖先类,Error 是 JVM 系统内部错误、资源耗尽等严重情况,Exception 是其他因编程错误或偶然的外在因素导致的一般性问题。RuntimeException 是错误的类型转换、数组下标越界、空指针...
3. **异常类的层次结构**:所有的异常都继承自`java.lang.Throwable`类,该类有两个主要子类:`Error`和`Exception`。`Error`通常表示系统级的严重问题,如内存溢出,一般不需程序员处理。`Exception`是程序员需要...
Java异常处理的关键字包括`try`, `catch`, `throw`, 和 `throws`。`try`块用于包含可能抛出异常的代码,`catch`块用来捕获并处理特定类型的异常,`throw`用于主动抛出一个异常,而`throws`则用于方法签名中,声明该...