Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

exception.getMessage() output with class name

I'm trying to fix an issue, in my application I have this code

try {   object1.method1(); } catch(Exception ex) {    JOptionPane.showMessageDialog(nulll, "Error: "+ex.getMessage()); } 

and the object1 would do something like that:

public void method1() {    //some code...    throw new RuntimeException("Cannot move file"); } 

I get a messsage in my option pane like this: Error: java.lang.RuntimeException: Cannot move file

but I used getMessage and not toString method, so the name of the class shouldn´t appear, right?

What I am doing wrong? I already tryied with a lot of exceptions, even Exception itself. I'm looking to solve this no without the need to implement my own Exception subclass

PROBLEM SOLVED - thank you all!

The try and catch were actually being called in get() method from SwingWorker which constructs an ExecutionException with my exception thrown from doInBackground() I fixed doing this:

@Override protected void done() {     try {         Object u = (Object) get();         //do whatever u want     } catch(ExecutionException ex) {         JOptionPane.showMessageDialog(null, "Error: "+ex.getCause().getMessage());     } catch(Exception ex) {         JOptionPane.showMessageDialog(null, "Error: "+ex.getMessage());     } } 
like image 745
fredcrs Avatar asked Jan 26 '12 11:01

fredcrs


People also ask

What is the output of getMessage () function?

The getMessage() method returns a description of the error or behaviour that caused the exception to be thrown.

What is exception getMessage ()?

The getMessage() method of Throwable class is used to return a detailed message of the Throwable object which can also be null. One can use this method to get the detail message of exception as a string value. Syntax: public String getMessage()

What is the use of getMessage ()?

The GetMessage function retrieves messages associated with the window identified by the hWnd parameter or any of its children, as specified by the IsChild function, and within the range of message values given by the wMsgFilterMin and wMsgFilterMax parameters.

How do I print an exception class?

The Throwable class provides the following three methods to print the exception message: Using printStackTrace Method. Using getMessage() Method. Using toString() Method.


2 Answers

I think you are wrapping your exception in another exception (which isn't in your code above). If you try out this code:

public static void main(String[] args) {     try {         throw new RuntimeException("Cannot move file");     } catch (Exception ex) {         JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage());     } } 

...you will see a popup that says exactly what you want.


However, to solve your problem (the wrapped exception) you need get to the "root" exception with the "correct" message. To do this you need to create a own recursive method getRootCause:

public static void main(String[] args) {     try {         throw new Exception(new RuntimeException("Cannot move file"));     } catch (Exception ex) {         JOptionPane.showMessageDialog(null,                                       "Error: " + getRootCause(ex).getMessage());     } }  public static Throwable getRootCause(Throwable throwable) {     if (throwable.getCause() != null)         return getRootCause(throwable.getCause());      return throwable; } 

Note: Unwrapping exceptions like this however, sort of breaks the abstractions. I encourage you to find out why the exception is wrapped and ask yourself if it makes sense.

like image 54
dacwe Avatar answered Oct 01 '22 09:10

dacwe


My guess is that you've got something in method1 which wraps one exception in another, and uses the toString() of the nested exception as the message of the wrapper. I suggest you take a copy of your project, and remove as much as you can while keeping the problem, until you've got a short but complete program which demonstrates it - at which point either it'll be clear what's going on, or we'll be in a better position to help fix it.

Here's a short but complete program which demonstrates RuntimeException.getMessage() behaving correctly:

public class Test {     public static void main(String[] args) {         try {             failingMethod();         } catch (Exception e) {             System.out.println("Error: " + e.getMessage());         }     }             private static void failingMethod() {         throw new RuntimeException("Just the message");     } } 

Output:

Error: Just the message 
like image 41
Jon Skeet Avatar answered Oct 01 '22 10:10

Jon Skeet