异常处理

待我称王封你为后i 2021-11-16 13:22 523阅读 0赞

1.异常概述
异常的类型:Error(致命的),Exception(非致命的)以及必检和免检异常。
异常就是一种对象,表示阻止正常进行程序执行的错误或者情况。
异常是从方法中抛出的。方法的调用者可以捕获以及处理该异常。
一个简单的例子:

package exception;

import java.util.Scanner;

public class QuotientWithIf {
public static void main(String [] args) {
Scanner input = new Scanner(System.in);
System.out.println(“输入两个数:”);
int num1 = input.nextInt();
int num2 = input.nextInt();
System.out.println(num1 + “/” + num2 + “ is “ + (num1/num2));
}

}
结果:

在这里插入图片描述

出现了异常错误,除数不能为零。
修改如下:
package exception;

import java.util.Scanner;

public class QuotientWithIf {
public static void main(String [] args) {
Scanner input = new Scanner(System.in);
System.out.println(“输入两个数:”);
int num1 = input.nextInt();
int num2 = input.nextInt();
if(num2!= 0) {
System.out.println(num1 + “/” + num2 + “ is “ + (num1/num2));
}
System.out.println(“除数不能为零”);
}

}

结果:
在这里插入图片描述
但是仍然存在问题,不应该让方法来终止程序,应该由调用者决定是否终止程序。也就是尽量不使用main方法终止,main方法只调用。如下:
package exception;

import java.util.Scanner;

public class QuotientWithIf {
public static int quotient(int num1 ,int num2) {
if(num2==0) {
System.out.println(“除数不能为零”);
System.exit(1);
}
return num1/num2;
}
public static void main(String [] args) {
Scanner input = new Scanner(System.in);
System.out.println(“输入两个数:”);
int num1 = input.nextInt();
int num2 = input.nextInt();
int result = quotient(num1,num2);
System.out.println(num1 + “/” + num2 + “ is “ + result);
}

}
结果:

在这里插入图片描述

这种防止异常的方法由人为的判断,调用对象无法得知是否发生异常
Java可以让一个方法抛出一个异常,该异常可以被调用者捕获和处理。
如下:
package exception;

import java.util.Scanner;

public class QuotientWithIf {
public static int quotient(int num1 ,int num2) {
if(num2==0) {
throw new ArithmeticException(“除数不能为零”);

  1. }
  2. return num1/num2;
  3. }
  4. public static void main(String [] args) {
  5. Scanner input = new Scanner(System.in);
  6. System.out.println("输入两个数:");
  7. int num1 = input.nextInt();
  8. int num2 = input.nextInt();
  9. try {
  10. int result = quotient(num1,num2);
  11. System.out.println(num1 + "/" + num2 + " is " + result);
  12. }
  13. catch(ArithmeticException ex){
  14. System.out.println("除数不能为零");
  15. }
  16. }

}

结果:

在这里插入图片描述
上面代码中的 throw new ArithmeticException();
throw语句的执行就是抛出一个异常。异常就是一个从异常类中创建的对象。
当异常被抛出的时候,正常的执行流程就被打断。抛出异常就是将异常从一个地方传递到另一个地方。
throw 语句类似方法的调用,但不同调用方法的是,它调用的是catch块,从某种意义上讲,catch就像带参数的方法定义,这些参数匹配抛出的值 的类型。但是,不像方法,在执行完catch快之后,程序控制不返回到throw语句,而是执行到catch块后的下一条语句。

使用异常处理的优点:
使方法抛出一个异常给它的调用者,并由调用者处理该异常。如果没有该能力,那么被调用的方法就必须自己处理异常或者终止该程序。被调用的方法在不知道出错的情况下该做什么,这是库方法的一般情况。库方法可以检查除错误,但是只有调用者才知道出现错误时需要做些什么。异常处理最根本的优势就是将检测错误从处理错误中分离出来。

很多库方法都会抛出异常,一个简单的例子。
package exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class InputException {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean continueInput = true;
do {
try {
System.out.println(“Enter an integer number:”);
int number =input.nextInt();
System.out.println(“The integer number is” + number);
continueInput = false;

  1. }
  2. catch(InputMismatchException ex) {
  3. System.out.println("Try again.(Incorrect input: an integer is required");
  4. input.nextLine();
  5. }
  6. }
  7. while(continueInput);
  8. }

}
结果:
Enter an integer number:
5.5
Try again.(Incorrect input: an integer is required
Enter an integer number:

5
The integer number is5

2.异常类型
异常是对象,而对象的采用都是用类来定义。异常的根类是java.lang.Throwable.
Throwable:
在这里插入图片描述
系统错误(error)是由虚拟机抛出的,用error类表示。Error类描述的是内部系统错误,很少发生。如果发生除了通知用户以及尽量稳妥的终止程序,几乎什么都不能做。
异常(Exception)使用Exception类来表示,它描述的是程序和外部环境所引起的错误,这些错误能够被捕获和处理
运行时异常(runtime exception)是用RuntimeException类表示的,它描述的是程序设计错误,例如,错误的类型转换,访问一个越界数组或者数值错误,运行时异常通常是由Java虚拟机抛出的。

3.异常的三种操作
(1)声明异常
在Java中当前执行的语句一定属于某个方法,Java解释器调用mian方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型。
任何代码都可能发生系统错误和运行时错误,因此,Java不要求在方法中显示声明Error和RuntimeException,但是方法抛出的其他异常都必须在方法头中显示声明,这样方法的调用者会被告知有异常
如:
public void myMethod() throws IOException{}
关键字throws表明myMethod方法可能会抛出异常

(2)抛出异常
检测到错误的程序可以创建一个合适的异常类型的实例并抛出它。

IllegalArgumentException ex = new IllegalArgumentException(“Wrong Argument”);
throws ex;
注意,声明异常的关键字是throws ,抛出异常的关键字是throw

(3)异常 的捕获
当抛出一个异常时,可以在try-catch块中捕获异常
如:
try{
satatements;
}
catch(Exception exVar1{
handle foe Ecception;
}

4.从异常中获取信息

在这里插入图片描述
上个图为虚拟机里的Trrowable类库方法。
在这里插入图片描述

  1. package exception;
  2. public class TestException {
  3. private static int sum(int [] list) {
  4. int result = 0;
  5. for(int i=0;i<list.length;i++) {
  6. result +=list[i];
  7. }
  8. return result;
  9. }
  10. public static void main(String[] args) {
  11. try {
  12. System.out.println(sum(new int[]{1,2,3,4,5}));
  13. }
  14. catch(Exception ex) {
  15. ex.printStackTrace();
  16. System.out.println("\n" + ex.getMessage());
  17. System.out.println("\n" + ex.toString());
  18. System.out.println("\nTrace InfoObtained from getStackTrace");
  19. StackTraceElement[] traceElements = ex.getStackTrace();
  20. for(int i=0;i<traceElements.length;i++) {
  21. System.out.println("method" + traceElements[i].getMethodName());
  22. System.out.println("(" + traceElements[i].getClassName() + ":");
  23. System.out.println(traceElements[i].getLineNumber() + ")");
  24. }
  25. }
  26. }
  27. }

结果:
在这里插入图片描述
一个声明,抛出和不捕获异常的例子

  1. package exception;
  2. public class CircleWithException {
  3. private double radius;
  4. private static int numberOfObjects =0;
  5. public double getRadius() {
  6. return radius;
  7. }
  8. public void setRadius(double newradius)throws IllegalArgumentException {
  9. if(newradius>=0) {
  10. radius = newradius;
  11. }
  12. else {
  13. throw new IllegalArgumentException("Radius cannot be negative");
  14. }
  15. }
  16. public static int getNumberOfObjects() {
  17. return numberOfObjects;
  18. }
  19. public CircleWithException() {
  20. this(1.0);
  21. }
  22. public CircleWithException(double newRadius) {
  23. // TODO Auto-generated constructor stub
  24. setRadius(newRadius);
  25. numberOfObjects++;
  26. }
  27. public double findArea() {
  28. return radius * radius* 3.14159;
  29. }
  30. }
  31. package exception;
  32. public class TestCircleWithException {
  33. public static void main(String [] args) {
  34. try {
  35. CircleWithException c1 =new CircleWithException(5);
  36. CircleWithException c2 =new CircleWithException(-5);
  37. CircleWithException c3 =new CircleWithException(0);
  38. }
  39. catch(IllegalArgumentException ex) {
  40. System.out.println(ex);
  41. }
  42. System.out.println("Number of objects created:" + CircleWithException.getNumberOfObjects());
  43. }
  44. }

结果:
在这里插入图片描述

5.finally子句
无论异常是否发生,finally子句都会被执行。
有时候,不论异常是否出现或者是否被捕获,都希望执行某些代码。所以用finally子句来达到这个目的。语法如下:
try{
statements;
}
catch(TheException ex){
handing ex;
}
finally{
finallyStatements;
}
注意事项:
***在使用try-catch块时,当处理不可预料处理 的错误状况时应该使用它。不要用try-catch块处理简单的,可预料的情况。***比如:
try{
System.out.println(refVar.toString());
}
catch(NullPointerException ex){
System.out.println(“refVar id null”);
}

应该用如下代码替换:
if(refVar ! =null)
System.out.println(refVar.toString());
else
System.out.println(“refVar id null”);

发表评论

表情:
评论列表 (有 0 条评论,523人围观)

还没有评论,来说两句吧...

相关阅读

    相关 异常处理

    1、异常与错误 错误对于程序而言是致命的,运用java的异常处理机制,异常发生后经过处理,程序还是能正常运行的。如:数组越界异常、除数为0异常等。异常类是指Exception

    相关 异常处理

    异常 1.什么是异常 在正常运行程序当中,即使语句或表达式在语法上是正确的,但在尝试执行时,它仍可能会引发错误。 在执行时检测到的错误被称为 “异常”,异常不一定会

    相关 异常处理

    所谓异常,就是以对象的方式表示一个或一类错误,该异常对象不仅封装了错误信息,还包含了错误发生时的“上下文”信息。传统的错误处理方式是,每当程序调用了某个方法进行了某种操作,程序

    相关 异常处理

    异常定义:         程序在运行时出现不正常情况。         问题也是现实生活中的一个具体事物,可以通过java类的形式进行描述。并封装成对象。Java对不正常

    相关 异常处理

    C++的异常处理机制被称为是不可恢复的:一旦异常被处理,程序的执行就不能够在异常被抛出的地方继续。如果这些 catch 子句不包含返回语句,在catch子句完成它的工作之后,程

    相关 异常处理

    概念         如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返

    相关 异常处理

    1.异常概述 异常的类型:Error(致命的),Exception(非致命的)以及必检和免检异常。 异常就是一种对象,表示阻止正常进行程序执行的错误或者情况。 异常

    相关 异常处理

    一、Error java虚拟机无法解决的严重问题。比如:JVM系统内部错误、资源耗尽等严重情况。StackOverflowError。 针对这类错误,一般不编写针对性的代码