什么是异常
程序运行出错被称为出现异常(Eception),异常是程序运行过程中发生的事件,该事件可以中断程序指令的正常执行流程。
eg:因数据元素下标越界而产生的运行时异常
public class ExceptionDemo{
public static void main(String[] args){
String[] friends={"Beila","Memei","Wangbo"};
for(int i=0;i<5;i++){
System.out.println(friends[i]);
}
System.out.println("This is the end!");
}
}
运行结果:
Beila
Memei
Wangbo
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at ExceptionDemo.main(ExceptionDemo.java:5)
异常处理
程序运行出错时的应对措施,是软件开发中的一个重要方面。
虽然对于外行人而言,计算机软件/程序应和精密的机械一样应该运行精准,但业内尤其是开发人员们都很清楚,程序运行难免出错,而出错后处理措施的优劣决定了软件的健壮性,进而影响到软件产品能否为用户接受和普及推广,甚至从一定程度上决定了软件产品的最终命运。
计算机软件/程序在运行时可以会遇到下列问题:比如我们无法确保用户总是按照规定的格式输入数据、无法确保程序要读取的文件总是保存在预期的位置、无法确保连接的数据库服务器永远处于就绪状态、也无法彻底杜绝运行程序的计算机内存耗尽、系统程序崩溃等问题。
作为一种面向对象的高级编程语言,Java在异常处理方拥有非常优秀的性能。
Java异常分类
Object
——Throwable
—— Error
—— VirtualMachineError
—— LinkageError
——...
——Exception
——RuntimeException
——IndexOfBoundsException
——NullPointerException
——ArithmeticException
——...
——IOException
——FileNotFoundException
——EOFException
——...
说明:
1、Throwable类是Java语言中所有异常类的父类
2、Error是指系统内部错误、资源耗尽等严重情况,而Exception则是指编程错误或偶然的外在因素导致的一般性问题,例如对负数开平方根、空指针访问、试图读取一存在的文件以及网络中断等。
典型的Java异常
一、Error类型
1、链接错误(LinkageError)
LinkageError 指的是程序链接错误。比如一个类中用到了另一个类,在编译前一个类之后,后一个类发生了不相容的改变时,使用前一个类则会出现链接错误,其中最常见的就是后一个类的.class文件被误删除而导致前一个类无法正常工作。
/////////////// A.java
public class A{
public void print(){
System.out.println("A is called");
}
}
////////////////////TestLinkageError.java
public class TestLinkageError{
public static void main(String[] args){
A a = new A();
a.print();
}
}
///////////////////正常运行结果:A is called
////////////////////如果删除了A.java生成的字节码文件A.class,则会出现下面的结果:
Exception in thread "main" java.lang.NoClassDefFoundError: A
at TestLinkageError.main(TestLinkageError.java:4)
Caused by: java.lang.ClassNotFoundException: A
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 1 more
注:
NoClassDefFoundError类是LinkageError的子类,当JVM动态链接(即加载)所需Java类却找不到该的.class文件时,则出现此异常
2、虚拟机错误(VirtualMachineError)
当Java虚拟机崩溃或用尽了它继续操作所需要的资源时,会抛出该错误,其中较有代表性的一种是StackOverflowError,当应用程序递归太深而导致栈溢出(即空间耗尽)时会出现的异常
////////////////TestVMError.java
public class TestVMError{
public static void main(String[]args){
TestVMError tvme = new TestVMError();
System.out.println("result="+tvme.f(100000));
}
public int f(int n){
if(n<=1)
return 1;
int k = n*f(n-1);
return k;
}
}
/////////////////////////运行结果如下///////////////////////
Exception in thread "main" java.lang.StackOverflowError
at TestVMError.f(TestVMError.java:7)
at TestVMError.f(TestVMError.java:9)
at TestVMError.f(TestVMError.java:9)
at TestVMError.f(TestVMError.java:9)
at TestVMError.f(TestVMError.java:9)
…………
小结:对于Error这些性质严重的异常,我们在编程过程中通过源代码对所发生的Error进行补救和恢复虽绝对不可能但也是极为困难,因此在开发中程序员对Error通常不做处理。而Exception可以认为是一种设计或实现问题,是程序员的责任。
二、Exception类型
1、空指针异常(NullPointerException)
//////////////////NPException.java
class Person{
public int age;
}
public class NPException{
public static void main(String[] args){
Person p = null;
System.out.println("age="+p.age);
}
}
/////////////////////运行结果:
Exception in thread "main" java.lang.NullPointerException
at NPException.main(NPException.java:8)
2、输入输出异常(IOException)
在程序中进行数据的输入/输出(I/0,Input/Output)操作时,经常会出现输入/输出异常(IOException),比如文件找不到,数据流已关闭等 。
/////////////////////////TestIOException.java
import java.io.*;
public class TestIOException{
public static void main(String[] args){
FileInputStream in = new FileInputStream("myfile.txt");
int b;
b = in.read();
while(b!=-1){
System.out.print((char)b);
b = in.read();
}
in.close();
}
}
////////////////////////////运行结果:
TestIOException.java:4: 未报告的异常 java.io.FileNotFoundException;必须对其进行
捕捉或声明以便抛出
FileInputStream in = new FileInputStream("myfile.txt");
^
TestIOException.java:6: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明
以便抛出
b = in.read();
^
TestIOException.java:9: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明
以便抛出
b = in.read();
^
TestIOException.java:11: 未报告的异常 java.io.IOException;必须对其进行捕捉或声
明以便抛出
in.close();
^
4 错误
Java异常处理机制
Java的异常处理机制中仍体现了面向对象的思想—Java程序执行过程中如出现异常,系统会监测到并自动生成一个相应的异常类对象,然后再将它交给运行时系统,运行时系统再寻找相应的代码来处理这一异常。我们把生成异常对象并将之提交给运行时系统的过程称为抛出(throw)异常;运行时系统在方法的调用栈中查找,即从生成异常的方法开始进行回溯,直到找到异常的处理代码为止。这一个过程称为捕获(catch)异常;执行处理代码的过程也就是处理异常的过程。如果Java运行时系统找不到可以处理异常的代码,则运行时系统将终止,相就的Java程序也将退出。程序员通常对错误(Error)无能为力,因而一般只处理违例(Exception)。
分享到:
相关推荐
Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...
java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理
本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计...
Java异常处理是编程中至关重要的一个环节,它允许开发者优雅地处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java中的异常处理机制基于一个独特的概念——异常(Exception),这是一种表示程序运行中...
这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供但无法直接访问)可能详细解释了Java异常处理的基本概念、机制以及最佳实践。 Java异常...
### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...
Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本篇文章将深入探讨Java异常处理的概念、机制以及如何通过代码实例进行有效的异常管理。 Java异常处理的核心...
Java异常处理设计是Java编程中一个至关重要的环节,它直接影响到程序的稳定性和可维护性。在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时...
Java异常处理的9个最佳实践涵盖了开发者在进行Java编程时应当遵循的一系列规则和方法,以确保代码的健壮性和可维护性。异常处理是编程中的一个重要部分,它能够帮助我们更有效地管理和响应程序运行时的错误情况。 ...
Java异常处理是Java编程语言中的一个关键特性,它允许程序员优雅地处理程序运行时可能出现的错误和不正常状况。在Java中,异常是程序执行过程中出现的问题,它们中断了正常的控制流程,使得程序无法继续按照预期的...
Java异常处理是Java编程中一个至关重要的概念,它关乎到程序的健壮性和稳定性。在Java语言中,异常处理提供了一种机制,使得程序在遇到错误或非正常情况时能够优雅地处理问题,而不是突然崩溃。这个“java高端技术...
通过遵循上述最佳实践,开发者可以编写出更健壮、可维护的Java代码,有效地利用Java异常处理机制来提高程序的稳定性。同时,阅读并理解"Effective Java Exceptions"文档可以帮助进一步深化对Java异常处理的理解。
从给定的文件内容中可以看出,这是一系列Java程序示例,它们用来说明Java异常处理机制。异常处理是Java语言中一个非常重要的部分,它能够帮助程序在遇到错误情况时仍然可以正常运行或者优雅地退出。这些程序通过各种...
java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验
以下是对Java异常处理的一些误区和经验总结。 **误区一:过度使用try-catch块** 有些开发者习惯于在每个函数的开始部分都套用try-catch块,以为这样可以捕捉所有可能出现的异常。实际上,这种做法使得代码变得混乱...
零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理...