捕获ArithmeticException但未按预期处理

时间:2015-04-17 18:29:44

标签: java try-catch handle arithmeticexception

我对整个捕获处理异常概念有点新意,我想知道为什么throws ArithmeticException在退出时不会产生异常错误消息(在这种情况下为/由零),而是在汇编。

不应该正常编译然后在屏幕上显示错误消息吗?我做错了什么?

public class Exception_Tester 
{ 
    public static void main(String args[]) 
    { 
         Exception_Tester et = new Exception_Tester(); 
         int x1; 
         int x2; 
         x1 = 5; 
         x2 = 0; 
         et.printResults(x1, x2); 
    } 

    void printResults(int a, int b) throws ArithmeticException 
    { 
         System.out.println("Add: "+(a+b)); 
         System.out.println("Sub: "+(a-b)); 
         System.out.println("Mul: "+(a*b));
         System.out.println("Div: "+(a/b));
    }  
} 

3 个答案:

答案 0 :(得分:0)

Checked Exception:如果您没有处理这些异常,这些异常会在编译时抛出错误。 Unchecked Exception:如果您尚未处理,则只会在RunTime中收到错误。

ArithmaticException是未经检查的异常,因此您将在运行时获得异常。

如果您使用的是try-catch块,则必须使用

printStackTrace()

打印异常堆栈跟踪的方法。

as:

try{
    System.out.println("Add: "+(a+b)); 
    System.out.println("Sub: "+(a-b)); 
    System.out.println("Mul: "+(a*b));
     System.out.println("Div: "+(a/b));
}
catch(ArithmeticException e){
    e.printStackTrace();
}

答案 1 :(得分:0)

看看下面的图片:

exceptions categories

正如您所看到的,一些异常类采用粗体字体来引起我们的注意。以下是编辑对这些例外类别的解释

  • 在正确的程序中很容易出现的条件是已检查的例外。具体地说,这些例外是<>。通过编译器,他可以正确地评估它们出现的可能性,并在环境对应时声明编译错误。从图中可以看出,NullPointerException不直接属于这一类:这些是直接扩展Exception类的异常。

  • 通常被视为致命的严重问题或可能反映程序错误的情况是未经检查的异常。

  • 致命情况由错误类表示。

  • 可能的错误由RuntimeException类表示。例如,扩展RuntimeException类的异常就是这种情况。 NullPointerException就是其中之一。在这种异常的大多数情况下,编译器无法评估它们将导致异常的@compile时间,因为存在对应用程序动态状态的强烈依赖性

这是一个简单的说明:

我创建了两个异常类,一个扩展了Exception

public class Exception1 extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

}

和一个扩展RuntimeException

public class Exception2 extends RuntimeException {

    private static final long serialVersionUID = 4595191052237661216L;

}

然后我有以下NewTester类

public class NewTester {

    public static void methodA() throws Exception1 {

        throw new Exception1();
    }

    public static void methodB() throws Exception2 {

        throw new Exception2();
    }

    public static void main(String[] args) {
        // methodA();
        methodB();
    }
}

我有目的地评论了对methodA的调用。在这种状态下,你没有任何编译错误,因为名为methodB的方法会抛出一个未选中的RuntimeException 。但是,如果您通过取消对methodA的调用并注释对methodB的调用来更改此代码,则会出现编译错误,因为methodA抛出已检查的异常

我希望这会有所帮助

答案 2 :(得分:0)

我按原样执行你的代码

public class Exception_Tester 
{ 
public static void main(String args[]) 
{ 
 Exception_Tester et = new Exception_Tester(); 
 int x1; 
 int x2; 
 x1 = 5; 
 x2 = 0; 
 et.printResults(x1, x2); 
} 
void printResults(int a, int b) throws ArithmeticException 
{ 
  System.out.println("Add: "+(a+b)); 
  System.out.println("Sub: "+(a-b)); 
  System.out.println("Mul: "+(a*b));
  System.out.println("Div: "+(a/b));
}  
} 

它编译正常,没有任何错误或异常,并且根据您的要求,仅在遇到System.out.println("Div: "+(a/b));语句时才在运行时抛出ArithmeticException。

所以我没有看到任何问题!