2013-01-03 38 views
20

Tại sao mã này không ném một số ArithmeticException? Hãy xem:Phân chia Java bằng 0 không ném một ArithmeticException - tại sao?

public class NewClass { 

    public static void main(String[] args) { 
     // TODO code application logic here 
     double tab[] = {1.2, 3.4, 0.0, 5.6}; 

     try { 
      for (int i = 0; i < tab.length; i++) { 
       tab[i] = 1.0/tab[i]; 
      } 
     } catch (ArithmeticException ae) { 
      System.out.println("ArithmeticException occured!"); 
     } 
    } 
} 

Tôi không biết!

+0

vậy làm thế nào tôi có thể thay đổi mã của tôi để có được một ArithmeticException? (Tôi không muốn thay đổi kiểu mảng thành int)? – Katie

+3

Điều này được nhân đôi http://stackoverflow.com/questions/5291606/why-does-1-0-give-error-but-1-0-0-returns-inf – Seba

+2

'if (tab [i ] == 0) ném ArithmeticException mới(); '. – assylias

Trả lời

13

Tại sao bạn không thể tự mình kiểm tra và ném ngoại lệ nếu đó là những gì bạn muốn.

try { 
     for (int i = 0; i < tab.length; i++) { 
      tab[i] = 1.0/tab[i]; 

      if (tab[i] == Double.POSITIVE_INFINITY || 
        tab[i] == Double.NEGATIVE_INFINITY) 
       throw new ArithmeticException(); 
     } 
    } catch (ArithmeticException ae) { 
     System.out.println("ArithmeticException occured!"); 
    } 
+4

Bạn cũng cần kiểm tra Double.isNaN(). –

10

0,0 là chữ gấp đôi và không được coi là số không tuyệt đối! Không có ngoại lệ bởi vì nó được coi là biến kép đủ lớn để giữ các giá trị đại diện cho gần vô cùng!

+0

Không, 0,0 thực sự là 0 và thông số điểm nổi IEEE xác định kết quả dưới dạng giá trị đặc biệt " cực dương ", không chỉ đơn thuần là một giá trị rất lớn. –

17

Đó là vì bạn đang xử lý các số dấu phẩy động. Phân chia theo số không trả về Infinity, tương tự như NaN (không phải là số).

Nếu bạn muốn ngăn chặn điều này, bạn phải kiểm tra tab[i] trước khi sử dụng. Sau đó, bạn có thể ném ngoại lệ của riêng bạn, nếu bạn thực sự cần nó.

51

IEEE 754 xác định 1.0/0.0 là vô cực và -1.0/0.0 là -Infinity và 0.0/0.0 là NaN.

Điểm nổi BTW cũng có -0.0 và do đó 1.0/ -0.0-Infinity.

Số học số nguyên không có bất kỳ giá trị nào trong số này và ném ngoại lệ thay thế.

Để kiểm tra tất cả các giá trị có thể, bao gồm NaN, 0.0, -0.0 có thể tạo ra một số không hữu hạn, bạn có thể thực hiện các thao tác sau.

if (Math.abs(tab[i] = 1/tab[i]) < Double.POSITIVE_INFINITY) 
    throw new ArithmeticException("Not finite"); 
+0

PeterLawrey: vậy làm thế nào tôi có thể thay đổi mã của tôi để có được một ArithmeticException? (Tôi không muốn thay đổi kiểu mảng thành int) – Katie

+2

@Katie bạn có thể kiểm tra 'if (tab [i] == 0.0) {ném new ArithmeticException();}' before 'tab [i] = 1.0/tab [i]; ' – codeMan

+2

BTW' 0.0 == -0.0' để bạn không phải kiểm tra hai giá trị. –

5

Java sẽ không ném ngoại lệ nếu bạn chia cho số không. Nó sẽ phát hiện lỗi thời gian chạy chỉ khi bạn chia cho số nguyên không bằng không bằng không.

Nếu bạn chia cho 0,0, kết quả sẽ là INFINITY.

1

Khi chia cho zero

  1. Nếu bạn chia đôi bởi 0, JVM sẽ hiển thị Infinity.

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); } 
    

    Console: Infinity

  2. Nếu bạn chia int bằng 0, sau đó JVM sẽ ném Arithmetic Exception.

    public static void main(String [] args){ 
        int a=10; 
        System.out.println(a/0); 
    } 
    

    Console: Exception in thread "main" java.lang.ArithmeticException:/by zero

Các vấn đề liên quan