Page 1 of 1

About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Oct 14, 2016 1:13 am
by corptrainer1
A student submitted the following error and it was verified by a course mentor:


I've attached screenshots about a question I believe may be incorrectly written. In my understanding the method doSomethingElse() is throwing an unchecked expression therefor should be wrapped in either a try/catch or declared thrown in the signature or it will be a compiler error. The material however ignores this fact.

http://screencast.com/t/uSYprVQH
http://screencast.com/t/08xgVslaUB

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Feb 17, 2017 2:12 pm
by AndaRO
MyException class must extends RuntimeException.

I can't see this in your images.

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Feb 17, 2017 9:30 pm
by admin
corptrainer1 wrote: I've attached screenshots about a question I believe may be incorrectly written. In my understanding the method doSomethingElse() is throwing an unchecked expression therefor should be wrapped in either a try/catch or declared thrown in the signature or it will be a compiler error.
Your understanding is not correct. An unchecked exception need not be caught or be declared in the throws clause.

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Jun 09, 2017 9:02 am
by yrelhan
How can I modify the code to remove the ArrayIndexOutOfBoundsException and see MySpecialException in action?

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Jun 09, 2017 9:18 am
by admin
Instead of calling doSomething(); in main, you can call doSomethingElse();

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Jun 09, 2017 9:22 am
by yrelhan
There is a CTE saying 'Cannot resolve MySpecialException.

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Fri Jun 09, 2017 9:46 am
by admin
Well, you have to write it as well. The problem statement says, (Assume that MySpecialException is an unchecked exception.) Adding the following line will do -

class MySpecialException extends RuntimeException{ }

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Wed Aug 16, 2017 2:41 pm
by Kevin30
I don't get why the exception is not caught anywhere.

So the question is:

What will the following code print when compiled and run?
(Assume that MySpecialException is an unchecked exception.)

Code: Select all

1. public class ExceptionTest {
2.    public static void main(String[] args) {
3.        try {
4.            doSomething();
5.        } catch (MySpecialException e) {
6.            System.out.println(e);
7.        }
8.    }
9.
10.    static void doSomething() {
11.        int[] array = new int[4];
12.        array[4] = 4;
13.        doSomethingElse();
14.    }
15.
16.    static void doSomethingElse() {
17.        throw new MySpecialException("Sorry, can't do something else");
18.    }
}
In the explanation, at the end you state that "Since the exception is not caught anywhere, it will be thrown out to the JVM, which will print the stack trace of the exception."

Now, it is my understanding that unchecked exceptions such as an "ArrayIndexOutOfBoundsException" don't have to be caught or declared, BUT THEY CAN BE CAUGHT.

I believe that the unchecked exception is indeed being caught here:

So my understanding is that the way this should go is as follows:
At line 4, the method doSomething() is being called. Then at line 12 an ArrayIndexOutOfBoundsException (which is an unchecked exception) is being thrown. Then this exception is being caught at line 5.

If I type in the code, then it doesn't give the result I think it should, but I don't see where my logic fails.
Can you point out where my reasoning goes wrong?

Thank you!

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Wed Aug 16, 2017 10:10 pm
by admin
Why do you think ArrayIndexOutOfBoundsException is being caught at line 5?
The catch at line 5 is for MySpecialException. Why do you think it will catch ArrayIndexOutOfBoundsException ?

HTH,
Paul.

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Thu Aug 17, 2017 6:02 am
by Kevin30
Aha, I get it now!

I thought ArrayIndexOutOfBoundsException would be caught at line 5 because it was an unchecked exception, just like MySpecialException is an unchecked exception.
But it's not the same unchecked exception as ArrayIndexOutOfBoundsException, nor is it defined as its superclass. So therefore ArrayIndexOutOfBoundsException will not be caught.

Thanks for your response!

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Thu Aug 17, 2017 6:50 am
by admin
It is not about whether the exception in the catch block is same or not. You need to see if the exception thrown in the try block satisfies the "is-a" test with respect to the exception class mentioned in the catch block.
For example, in this case, you need to see whether an instance of ArrayIndexOutOfBoundsException is-a MySpecialException? No. So an instance of ArrayIndexOutOfBoundsException cannot be caught by MySpecialException.

If the code in the try block threw an instance of a subclass of of MySpecialException, then it would have been caught by the given catch block.

HTH,
Paul.

Re: About Question enthuware.ocajp.i.v8.2.1385 :

Posted: Thu Aug 17, 2017 11:26 am
by Kevin30
Thank you!
It is clear now.