Java异常与异常处理简单使用

  异常就是程序运行过程中阻止当前方法或作用域继续执行的问题;

  任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示、保存当前用户操作或改动、未完成的业务回滚、释放程序占用的资源等。

  在Java中,Throwable异常类是所有异常类的祖先,任何异常类都继承于Throwable类;

  Throwable类主要有两个子类:Error类、Exception类

  Error异常类是系统异常,比如:虚拟机错误(VirtualMachineError)、线程死锁(ThreadDeath)等,Error类异常一旦发生,程序将会崩溃

  Exception是开发中我们最常见的一般异常,这种异常原因可能是程序代码编写错误,环境问题,用户输入错误等异常

  Exception异常一般分为:运行时异常(RuntimeException)也称为非检查异常、检查异常;

  非检查异常常见的有:输出空指针时的异常,数组下标越界异常,类型转换异常,算术异常(比如0作为分母)等,运行时异常会由Java虚拟机自动捕获,自动抛出,一般是我们写的代码本身有问题,需要改进我们的代码来解决

  检查异常的原因有可能是:文件异常(不存在或者权限)、数据库连接异常、网络连接异常等,这种异常系统不会自动捕获,需要我们手动添加捕获处理的语句

  

  我们通常使用try-catch以及try-catch-finally代码块来处理异常

  try代码块中是可能发生异常的语句,当程序确实发生异常了,try块中程序会中止执行,并且抛出异常给catch块进行处理,catch根据需要去处理异常、记录错误日志等,看一个简单示例:

 1 import java.util.Scanner;
 2
 3 public class Ceshi {
 4     public static void main(String[] args){
 5         try{
 6             System.out.println("请输入一个整数:");
 7             Scanner input = new Scanner(System.in);
 8             int a = input.nextInt();
 9             System.out.println("您输入的是:" + a);
10         }catch(Exception e){
11             System.out.println("输入异常");
12             e.printStackTrace();    //打印异常信息
13         }
14         System.out.println("程序执行结束");
15     }
16 }

这是一个最简单的异常处理,通过Scanner获取用户输入,当用户正确输入时程序正常执行,当然catch块不会被执行,但是用户如果输入的不是整数,那么就会抛出异常给catch块,可以利用printStackTrace()方法打印具体的异常,注意无论程序是否异常try-catch外的语句都会被正常执行,错误结果如下:

根据结果可以看到我们输入字符串"3s"之后,抛出了异常并且提示输入异常,最后但是try-catch后面的语句正常执行,抛出的e.printStackTrace()会在最后被打印出来,可以看出来是Ceshi.java第就行发生了异常产生了终止,那么就是在a接收输入这一行语句中发生的异常,那么在这一行之后的所有try块中的语句便终止执行

另外如果try中的代码会抛出好几个类型的异常,那么我们需要多个catch块来处理,并且加上finally进行善后处理工作

 1 import java.util.Scanner;
 2 import java.util.InputMismatchException;
 3 import java.lang.ArithmeticException;
 4 public class Ceshi {
 5     public static void main(String[] args){
 6         Scanner input = new Scanner(System.in);
 7         try{
 8             System.out.println("请输入分子:");
 9             int a = input.nextInt();
10             System.out.println("您输入分母:");
11             int b = input.nextInt();
12             System.out.println("计算结果是:" + a*1.0/b);
13         }catch(InputMismatchException e){
14             System.out.println("请输入整数");
15             e.printStackTrace();    //打印异常信息
16         }catch(ArithmeticException e){
17             System.out.println("分母不能为0");
18             e.printStackTrace();    //打印异常信息
19         }catch(Exception e){
20             System.out.println("其他未知异常");
21             e.printStackTrace();
22         }finally{
23             input.close();
24         }
25         System.out.println("程序执行结束");
26     }
27 }

以上的处理就比较合理了,首先保证输入是整数,如果都是整数那么分母为0也会抛出异常,最后如果还有我们考虑不到的异常,那么就通过Exception父类抛出异常,catch异常块从上到下一般是是由小到大或者由子类到父类的异常类抛出,就是从作用范围来说从细节到整体,Exception异常类抛出必须放在最后面,这样能抛出我们开发中遇到的所有异常,另外finally块建议带上,当遇到异常时,他可以释放前面还未操作的系统资源,比如例子中的关闭输入,这样能提高程序的健壮性,如果try和catch中有返回值,那么finally中的语句会在try和catch语句块中的return返回值返回到调用者之前,获得该返回值,我们可以在程序中输出他们,但是放在try-catch-finally外返回值时在finally是无法获取到的,只能获取前面的变量值

  Java中方法异常抛出,因为很多代码我们会写到方法中,为了便于管理,我们可以在专门的方法中处理异常,所以我们可以将方法中的异常向上抛出,可以写一个方法来简单抛出异常,代码如下:

1 public void divide(int a,int b) throws Exception {
2     if(b == 0){
3         throw new Exception("除数不能为零!");
4     }else{
5         System.out.println("结果为:" + a*1.0/b);
6     }
7 }

当该方法被调用时,那么如果发生异常,异常将抛出到调用的语句块中,我们可以在调用的时候进行处理,比如:

1 public void complte() {
2     try{
3         divide(5,0);    //此时发生异常,调用方法将异常抛出到这里
4     }catch(Exception e){
5         System.out.println(e.getMessage());    //此处捕获异常,将方法中定义的异常信息抛出
6     }
7 }

这样就把方法中的异常抛出并进行了处理,另外我们还可以不在complte方法中抛出,还可以向上抛出,由上面调用该方法时抛出异常,代码如下:

public void complte() throws Exception {
    /**
     * 省略方法中的代码
     */
    divide(5,0);    //将里面的异常抛出到调用complte方法的位置
}

这样的话异常继续向上抛出,最终还是按照第二段代码的方式来处理异常,所以用throws关键字声明此方法向上抛出异常,用throw关键字来抛出异常

  自定义异常

  除了利用系统的异常我们还可以自定义异常,以便适应我们情景的需要,简单定义个异常类:

 1 public class CeshiException extends Exception {
 2
 3     public CeshiException(){
 4
 5     }
 6
 7     public CeshiException(String message){
 8         super(message);
 9     }
10 }

注意,自定义异常类必须继承于Exception异常类,里面定义了一个有参数的构造方法来自定义异常信息,无参的构造方法是为了实例化类时,默认不会发生错误,那么我们可以在方法中具体来使用这个自定义异常类了:

 1 public class ChainTest {
 2
 3     /**
 4      * test1():抛出自定义异常
 5      * test2():调用test1(),捕获自定义异常,并且包装成运行时异常,抛出新异常
 6      * main方法中,调用test2(),尝试捕获test2()方法抛出的异常
 7      */
 8     public static void main(String[] args) {
 9         ChainTest ct = new ChainTest();
10         try{
11             ct.test2();
12         }catch(Exception e){
13             e.printStackTrace();
14         }
15     }
16
17     public void test1() throws CeshiException{
18         throw new CeshiException("原始自定义异常抛出");
19     }
20
21     public void test2(){
22         try {
23             test1();
24         } catch (CeshiException e) {
25             // TODO Auto-generated catch block
26             RuntimeException newExc =
27                 new RuntimeException("抛出新运行时异常");
28             newExc.initCause(e);    //引用原始异常方法,异常链
29             throw newExc;
30         }
31     }
32 }

根据代码可以看出,main方法调用test2方法并捕获test2方法抛出的异常,而test2方法中运行test1并捕获test1方法中抛出的自定义异常,并且自己也抛出一个新的运行时异常抛出到main方法中,而test1方法通过声明自定义异常类实现了抛出自定义异常类中的异常方法,将异常抛出到test2中,这样就好比一连串的异常抛出和异常处理,同时结合了自定义异常,这样就形成了一个小型的异常链,就好像链式反应一样去抛出异常

  最后,总结一下,通过try-catch来处理异常,并不能避免错误的存在性,而是尽量提高程序的健壮性,减小程序错误而带来的安全风险和损失,我们不能一味的用try-catch来屏蔽错误,我们应该采用合理的逻辑算法来解决程序设计的不足,try-catch只是一个作为辅助使用,不可以过分依赖;

  在多重catch块之后,最好加个catch(Exception e){}来处理其他可能会被遗漏的未知的异常,对于不太确定的异常,可以加上try-catch来处理潜在的风险;

  对于异常一定要尽量去处理,千万不要只是简单地使用e.printStackTrace();来打印错误信息,这样就失去了异常处理的意义;

  具体如何处理异常,应该根据不同的业务需求和异常类型来确定;

  最后要善于在try-catch块后面添加finally语句块,释放系统资源的占用,比如网络连接、数据库连接、文件关闭等;

  什么时候怎么使用异常,还需要自己以后在开发中慢慢的熟悉

时间: 2024-11-01 02:27:06

Java异常与异常处理简单使用的相关文章

那些年,我们不懂的却又不得不提的 JAVA异常和异常处理!

---恢复内容开始--- 首先,我是个小小的菜鸟,最近突然突发奇想,想研究一下java的异常和异常的处理,稍有些理解,老鸟们莫要嘲笑... 既然要讲异常和异常的处理,我们就要先了解异常,那么,什么是异常呢? 简单的说,就是在一个程序运行的时候,发生的不可知的错误时而停止运行的时候,我管它叫做异常. 可以说异常时时刻刻陪在我们身边,从简单的代码环节,到生活上,都有可能发生异常.举个比例,我们去爬山的时候 要坐电缆,可是不巧,电缆没电了,怎么办? 一般情况我们有两种解决方法,一个是爬上去,一个是呆在

Java 异常及异常处理

1.什么是异常 简单来说,就是由于程序运行是出现的问题,但是可以通过try-和catch捕获处理,之后程序继续运行. 在java中,分异常(Exception)和错误(error)两种.其中"异常"是程序编写不完善(或者由于外部原因,网络错误,文件错误等)引起的:而"错误"虚拟机本身故障(如OutOfMemoryError),一旦出现错误,我们将不能处理,程序将无法继续执行. 2.异常处理流程 try{ // your code }catch(Exception1

java异常、异常处理机制

任何一种程序设计语言设计的程序在运行时都有可能出现错误. 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生. 对于这些错误,一般有两种解决方法: 遇到错误就终止程序的运行. 由程序员在编写程序时,就考虑到错误的检测.错误消息的提示,以及错误的处理. java异常 在java语言中,将程序执行中发生的不正常情况称之为“异常”. java中的异常用于处理非预期的情况,如文件没找到,网络错误,非法的参数. java程序运行过程中所发生的异常事件可分为两类: Error:JVM系统内部错误.

JAVA异常与异常处理详解

一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都继承于Throwable类.Throwable主要包括两个大类,一个是Error类,另一个是Exception类: 2.其中Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者: 3.Exception类,也就是通常所说的"异常".主要指编码.环

Java中的异常处理机制的简单原理和应用。

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间.地点.人物.情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息. Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Erro

Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae

Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异常的统一处理 1 3.  java异常转换为js异常 1 3. -------------详细代码 2 1. 1. javascript异常处理机制 Throw str Not throw error  ..cause ie,ff error obj is diff.. 2. 2. Web前后台异常

Atititjs javascript异常处理机制与java异常的转换.js exception process

Atititjs javascript异常处理机制与java异常的转换.js exception process 1. javascript异常处理机制 Throw str Not throw error  ..cause ie,ff error obj is diff.. 2. Web前后台异常的统一处理 不个java异常转换成个js异常走ok... 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[email protected] 转载请注明来源: http://blog.csd

JAVA中的异常(异常处理流程、异常处理的缺陷)

异常处理流程 1)首先由try{...}catch(Exception e){ System.out.println(e); e.printStackTrace(); }finally{...}结构 2)当JVM遇到异常时,会产生一个Exception对象 或 继承自Exception的子类的对象. 3)将异常对象向上层(调用它的代码块)抛出,知道碰到一个catch块(作相应处理) 或 一直抛到了最外层(导致程序异常终止).(并停止异常之后的代码的执行,但是finally块中的代码还会执行!换句

java 自己定义异常,记录日志简单说明!留着以后真接复制

log4j 相关配制说明:http://blog.csdn.net/liangrui1988/article/details/17435139 自己定义异常 package org.rui.ExceptionTest; public class ExtraFeature { //-------使用------ public static void f()throws MyException { System.out.println("MyException from f()"); th