01/10/2018, 00:47

Thắc mắc về try lồng trong java

[Thắc mắc] về try lồng:

Anh chị giúp em với tại sao trong đoạn code bên dưới lỗi vượt quá giới hạn mảng lại bị bắt ở try bên ngoài vậy? theo như em nghĩ thì try bên ngoài duyệt hết phần tử của num còn try bên trong thực hiện việc chia num / num1, vì num có phần tử lớn hơn num1 nên phát sinh lỗi vượt quá giới hạn mảng, em thấy for của try bên ngoài đúng, khi vào try bên trong mới phát sinh lỗi vì num có phần tử lớn hơn num1 như vậy thì bắt lỗi giới hạn mảng phải là try bên trong chứ? nhưng kết quả lại khác với những gì em nghĩ, em là newbie mong anh chị giúp đỡ
----------[spoiler]This text will be blurred[/spoiler]
int [] num = {1,2,3};
int [] num1 = {1,0};
try{//try bên ngoài
for (int i = 0; i < num.length; i++) {
try{// try bên trong
System.out.println(num[i] + " / “+ num1[i] +” bang "+ num[i]/num1[i]);
} catch (ArithmeticException exc) {
System.out.println(“Khong the chia cho 0”);
}
}
} catch (ArrayIndexOutOfBoundsException exc) {
System.out.println(“Ko tim thay phan tu tuong ung. Chuong trinh dung lai”);
}

Hidan viết 02:55 ngày 01/10/2018

t cũng mới học nhưng t toàn thấy và làm 1 try xong nhiều catch như này nhìn rất logic chứ chưa thấy ai dùng try lồng bao giờ

Hidan viết 02:56 ngày 01/10/2018

try bên trong nó chỉ bắt lỗi ArithmeticException thôi, còn lỗi tràn mảng thì dc try bên ngoài xử lý ArrayIndexOutOfBoundsException đó.
tốt nhất nên làm 1 try xong 2 catch kia không thì 1 catch exception.

anon52681320 viết 03:01 ngày 01/10/2018

ArithmeticException

exception này chỉ bắt lỗi về toán học, ví dụ: chia cho 0. Còn lỗi IndexOutOfBound thì bản thân nó không handle lỗi này nên bị bắt ở try-catch ngoài.

Trần Gia Hưng viết 02:49 ngày 01/10/2018

em hiểu như thế này không biết có đúng ko? nếu tư duy sai thì anh giải đáp nhé :)) sợ hiểu sai vấn đề từ đầu rồi lại suy luận theo hướng sai thì sai lại càng thêm sai

“Try bên trong” phát hiện lỗi nên throw lỗi vừa phát sinh, “catch trong” ko bắt được throw vừa phát sinh nên bị đẩy ra khối “try ngoài”, tại khối “try ngoài” thì bị bắt bởi catch thuộc khối “try ngoài”

anon52681320 viết 03:03 ngày 01/10/2018

Hiểu theo cách vậy cũng đúng, khi bắt Exception, thường là ngoài các ngoại lệ mình muốn handle, như NullPointerException, IllegalArgumentException… thì sẽ bắt thêm Exception (cha của mọi Exception) để handle những lỗi không quản lý được, tránh crash chương trình.

Hidan viết 02:53 ngày 01/10/2018

e nghĩ NullPointerException bị lỗi khi mình khai báo mà ko new chứ e ko biết bắt cái này kiểu gì nếu biết nó bị lỗi ở đó thì sửa trực tiếp chẳng cần try catch làm gì ? a có thể cho e ví dụ dc ko

Quân viết 02:51 ngày 01/10/2018

NullPointerException không phải chỉ do khai báo mà không new, mà có thể là set biến về null nữa.
giả sử có đoạn code này

class AmazingBrain{
    private StupidMindObject _myStupidMind = new StupidMindObject();

    public void setStupidMindObject(StupidMindObject obj){
        _myStupidMind = obj;
    }

    public void doAmazingThing(StupidObject stupidObject){
        stupidObject.doStupidThing();
        _myStupidMind.doStupidThing();
    }

    public static void main(String[] args){
        AmazingBrain brain = new AmazingBrain();
        brain.setStupidMindObject(null);
        brain.doAmazingThing(null);
    }
}

bạn có chắc là thằng stupidObject hoặc _myStupidMind không bao giờ null, nếu bạn chắc nó không null, thì cái method doStupidThing mà nó gọi có chắc sẽ chạy suôn sẻ mà không throw ra lỗi NullPointerException ở bên trong method đó.
Đó chính là ý nghĩa của NullPointerException nếu bạn cần handle.

Bài liên quan
0