Easy to Learn Java: Programming Articles, Examples and Tips

Start with Java in a few days with Java Lessons or Lectures

Home

Code Examples

Java Tools

More Java Tools!

Java Forum

All Java Tips

Books

Submit News
Search the site here...
Search...
 
Search the JavaFAQ.nu
1000 Java Tips ebook

1000 Java Tips - Click here for the high resolution copy!1000 Java Tips - Click here for the high resolution copy!

Java Screensaver, take it here

Free "1000 Java Tips" eBook is here! It is huge collection of big and small Java programming articles and tips. Please take your copy here.

Take your copy of free "Java Technology Screensaver"!.

Easy Learn Java: Programming Articles, Examples and Tips - Page 185


Previous 1060 Stories (530 Pages, 2 Per Page) Next

Story By Dr. Kabutz: Serializing GUI Components Across Network, follow up

Go to all tips in Story by Dr. Kabutz

2001-03-15 The Java Specialists' Newsletter [Issue 013b] - Follow-up

Author: Dr. Heinz M. Kabutz

You can subscribe from our home page: http://www.javaspecialists.co.za (which also hosts all previous issues, available free of charge Smile


Hi again,

Imagine my horror this morning when I tried to run the code from last nights newsletter and discovered that it generated an exception! On frantic searching I figured that the JBuilder 3.0 compiler produces a different result to the SUN JDK 1.3 compiler. I had only run the program from within JBuilder, so I got quite a surprise that it did not work in SUN. The reason I'm blaming the compiler is because when I ran the class files generated by JBuilder 3.0 with the JDK 1.3 VM it works perfectly.

The problem is that if you call out.defaultWriteObject(), the two compilers have different ideas of which object you are calling this from, because you are inside an inner class. The SUN compiler thinks you are calling it from ComponentSerializer and that is not serializable.

The solution is quite simple, just move the ComponentEncapsulator class out of the ComponentSerializer class and it should work with the JDK 1.3 compiler.

We thus end up with ComponentSerializer:

//: ComponentSerializer.java
import java.io.*;
import java.awt.*;
public class ComponentSerializer {
  public void write(Component comp, OutputStream out)
      throws IOException {
    System.out.println("writing " + comp);
    ObjectOutputStream oout = new ObjectOutputStream(out);
    oout.writeObject(new ComponentEncapsulator(comp));
    oout.reset();
    oout.flush();
  }
  public Component read(InputStream in)
      throws IOException, ClassNotFoundException {
    System.out.println("reading component");
    ObjectInputStream oin = new ObjectInputStream(in);
    ComponentEncapsulator enc =
      (ComponentEncapsulator)oin.readObject();
    return enc.getComponent();
  }
}
 

and ComponentEncapsulator:

//: ComponentEncapsulator.java
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.lang.reflect.*; // wouldn't be right for me to send
           // you a newsletter that doesn't use reflection Smile
class ComponentEncapsulator implements Serializable {
  private final Component comp;
  private IOException defaultWriteException;
  public ComponentEncapsulator(Component comp) {
    this.comp = comp;
  }
  public Component getComponent() {
    return comp;
  }
  private void writeObject(final ObjectOutputStream out)
      throws IOException {
    if (SwingUtilities.isEventDispatchThread()) {
      // This is all that is necessary if we are already in
      // the event dispatch thread, e.g. a user clicked a
      // button which caused the object to be written
      out.defaultWriteObject();
    } else {
      try {
        // we want to wait until the object has been written
        // before continuing.  If we called this from the
        // event dispatch thread we would get an exception
        SwingUtilities.invokeAndWait(new Runnable() {
          public void run() {
            try {
              // easiest way to indicate to the enclosing class
              // that an exception occurred is to have a member
              // which keeps the IOException
              defaultWriteException = null;
              // we call the actual write object method
              out.defaultWriteObject();
            } catch(IOException ex) {
              // oops, an exception occurred, remember the
              // exception object
              defaultWriteException = ex;
            }
          }
        });
        if (defaultWriteException != null) {
          // an exception occurred in the code above, throw it!
          throw defaultWriteException;
        }
      } catch(InterruptedException ex) {
        // I'm not quite sure what do here, perhaps:
        Thread.currentThread().interrupt();
        return;
      } catch(InvocationTargetException ex) {
        // This can actually only be a RuntimeException or an
        // Error - in either case we want to rethrow them
        Throwable target = ex.getTargetException();
        if (target instanceof RuntimeException) {
          throw (RuntimeException)target;
        } else if (target instanceof Error) {
          throw (Error)target;
        }
        ex.printStackTrace(); // this should not happen!
        throw new RuntimeException(ex.toString());
      }
    }
  }
}

This highlights again that we have to be quite careful with Java. In the big project that we work on, we have standardized on the JDK 1.3 compiler and ALL our classes have to be compiled with that. This happened only after much nailbiting because of slight compiler differences of various IDEs.


Copyright 2000-2003 Maximum Solutions, South Africa

Reprint Rights. Copyright subsists in all the material included in this email, but you may freely share the entire email with anyone you feel may be interested, and you may reprint excerpts both online and offline provided that you acknowledge the source as follows: This material from The Java(tm) Specialists' Newsletter by Maximum Solutions (South Africa). Please contact Maximum Solutions for more information.

Java and Sun are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. Maximum Solutions is independent of Sun Microsystems, Inc.


5493 bytes more | 4 comments | Printer Friendly Page  Send to a Friend | Story By Dr. Kabutz | Score: 0
Posted by jalex on Monday, March 15, 2004 (00:00:00) (3625 reads)

The Java Lesson 12: Class methods and how they are called

Go to all tips in Java Lessons by Jon Huhtala
All Java Lessons contents page | Java Lesson 1 | Java Lesson 2 | Java Lesson 3 | Java Lesson 4 | Java Lesson 5 | Java Lesson 6 | Java Lesson 7 | Java Lesson 8 | Java Lesson 9 | Java Lesson 10 | Java Lesson 11 | Java Lesson 12 | Java Lesson 13 | Java Lesson 14 | Java Lesson 15 | Java Lesson 16 | Java Lesson 17 | Java Lesson 18 | Java Lesson 19 | Java Lesson 20 | Java Lesson 21 | Java Lesson 22 | Java Lesson 23 | Java Lesson 24 | Java Lesson 25 | Java Lesson 26 | Java Lesson 27 | Java Lesson 28 | Java Lesson 29 | Java Lesson 30 | Java Lesson 31 | Java Lesson 32 | Java Lesson 33 | Java Lesson 34 | Java Lesson 35 | Java Lesson 36 | Java Lesson 37 | Java Lesson 38 | Java Lesson 39 | Java Lesson 40 | Java Lesson 41 | Java Lesson 42 | Java Lesson 43 | Java Lesson 44 | Java Lesson 45 | Java Lesson 46

The Java Lesson 12

Class methods and how they are called


Methods

  • Are named modules of code

  • May optionally receive one or more parameters (arguments)

  • May optionally return a single value

  • Are associated with either a class or an object of a class. The former are called "class methods" and are the focus of this lesson. The latter are called "instance methods" and will be covered in a later lesson.

Calling a class method

  • Involves the following general syntax for the call expression:

class-name.method-name(arguments)

If the method is defined within the current class, the class name may be omitted and the general syntax for the call expression is:

method-name(arguments)

  • Can occur anywhere the returned data type makes sense. Methods that return no value are called in a stand-alone statement. Methods that return a value are called within another expression.

Example 1: Calling the skip() method of my Utility class to skip a single line on the screen. The method requires no parameters and returns no value so is called using the stand-alone statement

Utility.skip();

The parenthesis are required by the compiler and must be coded even though no parameters are being passed.

Example 2: Calling the separator() method of my Utility class to draw a line consisting of a particular character on the screen. The method requires two parameters. The first is an integer indicating the length of a line of characters to be drawn. The second parameter specifies the character to be used in drawing the line. The method returns no value so is called using a stand-alone statement such as

Utility.separator(40, '$');

which will draw a line consisting of 40 dollar signs.

Example 3: Calling the moneyFormat() method of my Utility class to convert a numeric value into a formatted currency string having correct punctuation. The method requires a single parameter of type double that represents the value to be formatted. It returns the formatted string. Because it returns a value, it is called within another expression such as

System.out.println("Balance: " + Utility.moneyFormat(4567.89));

which will convert the double literal 4567.89 into the string "$4,567.89", append it to the string "Balance: ", and pass the resulting string to the println() method of System.out for display on the console. Such nesting of calls is sometimes referred to as "cascading" and is one of the most powerful features of Java.

In these examples, literals were used as parameters. In most real programs, a variable or an expression that evaluates to the appropriate data type for the parameter is used.


A sample program

The following program processes multiple line items for an order. It uses several class methods of my Utility and Keyboard classes:

public class App {
public static void main(String[] args) {

// Variables.

int quantity;
double price;
double extendedPrice;
int lineItems = 0;
double totalDue = 0;
char again = 'y';

// Main loop to process one line item.

while (again == 'Y' || again =='y') {

// Prompt for and read quantity and price.

Utility.separator(40, '=');
System.out.print("Quantity: ");
quantity = Keyboard.readInt();
System.out.print("Price: ");
price = Keyboard.readDouble();
Utility.skip();

// If the data is invalid, display an error message. Otherwise,
// calculate and display the extended price, add to the total due
// for the entire order, and increment the number of line items.

if (quantity <= 0 || price < 0) {
System.out.println(" Invalid data");
}
else {
extendedPrice = quantity * price;
System.out.println(" Extended price: " +
Utility.moneyFormat(extendedPrice));
totalDue += extendedPrice;
lineItems++;
}

// Ask the user if they want to do it again and repeat the loop as
// requested.

Utility.separator(40, '=');
System.out.print("Again? (Y/N): ");
again = Keyboard.readChar();
}

// Display the order summary.

Utility.separator(40, '=');
System.out.println(" Line items: " + lineItems);
System.out.println(" Total due: " + Utility.moneyFormat(totalDue));
Utility.separator(40, '=');
System.out.println(" END");
}
}

Note: For more details, refer to the documentation for my Keyboard class and my Utility class.

Looking ahead

Knowing how to call class methods is an important part of Java programming. Future lessons will introduce some useful class methods within the Math class of Java's packaged code. You will also learn how to define your own custom class methods.

Lab exercise for Ferris students

E-mail your answers to this assignment no later than the due date listed in the class schedule.

Review questions

  1. Assume that someMethod is a class method of a class named SomeClass that requires no parameters and returns no value. Which one of the following statements would be valid for calling someMethod from a class named MyClass?

  1. someMethod;

  2. someMethod();

  3. SomeClass.someMethod;

  4. SomeClass.someMethod();

  5. none of the above

  1. Assume that getValue is a class method of a class named Calculate that requires no parameters and returns an integer value. Which of the following statements would be valid for calling getValue from a different class? (choose three)

  1. int x = Calculate.getValue(3);

  2. int x = Calculate.getValue();

  3. System.out.println("Value: " + (5 * Calculate.getValue()));

  4. Calculate.getValue();

  5. double y = getValue();

  1. Assuming all unseen code is correct and using the methods of my Keyboard and Utility classes, what will happen when an attempt is made to compile and execute the following statements?

System.out.print("Enter an integer: ");
System.out.println("You entered: " + Keyboard.readInt());

  1. the first statement will not compile

  2. the second statement will not compile

  3. the statements will compile but an error will occur at run time when the second statement is executed

  4. the statements will compile and run. If the user enters the integer 7, the message "You entered: 7" will be displayed on the console.

  5. the statements will compile and run. If the user enters the integer 7, the message "You entered: " will be displayed on the console.

  1. Assuming all unseen code is correct and using the methods of my Keyboard and Utility classes, what will happen when an attempt is made to compile and execute the following statements? Note that the line numbers are for reference purposes only.

1
2
3
4
Utility.separator('^', 50);
System.out.print("Enter interest rate as .nnn: ");
float rate = Keyboard.readFloat();
System.out.println("You entered: " + Utility.percentFormat(rate, 1));
  1. a compile error will occur at line 1

  2. a compile error will occur at line 3

  3. a compile error will occur at line 4

  4. the statements will compile and run. Assuming that the user enters 5.7 in response to the prompt, the following will appear on the console:

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Enter interest rate as .nnn: .057
You entered: 5.7%

  1. the statements will compile and run. Assuming that the user enters 5.7 in response to the prompt, the following will appear on the console:

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    Enter interest rate as .nnn: .057
    You entered: 6%


10520 bytes more | comments? | Printer Friendly Page  Send to a Friend | Score: 4
Posted by jalex on Saturday, March 13, 2004 (00:00:00) (15763 reads)

Previous 1060 Stories (530 Pages, 2 Per Page) Next

530| 529| 528| 527| 526| 525| 524| 523| 522| 521| 520| 519| 518| 517| 516| 515| 514| 513| 512| 511| 510| 509| 508| 507| 506| 505| 504| 503| 502| 501| 500| 499| 498| 497| 496| 495| 494| 493| 492| 491| 490| 489| 488| 487| 486| 485| 484| 483| 482| 481| 480| 479| 478| 477| 476| 475| 474| 473| 472| 471| 470| 469| 468| 467| 466| 465| 464| 463| 462| 461| 460| 459| 458| 457| 456| 455| 454| 453| 452| 451| 450| 449| 448| 447| 446| 445| 444| 443| 442| 441| 440| 439| 438| 437| 436| 435| 434| 433| 432| 431| 430| 429| 428| 427| 426| 425| 424| 423| 422| 421| 420| 419| 418| 417| 416| 415| 414| 413| 412| 411| 410| 409| 408| 407| 406| 405| 404| 403| 402| 401| 400| 399| 398| 397| 396| 395| 394| 393| 392| 391| 390| 389| 388| 387| 386| 385| 384| 383| 382| 381| 380| 379| 378| 377| 376| 375| 374| 373| 372| 371| 370| 369| 368| 367| 366| 365| 364| 363| 362| 361| 360| 359| 358| 357| 356| 355| 354| 353| 352| 351| 350| 349| 348| 347| 346| 345| 344| 343| 342| 341| 340| 339| 338| 337| 336| 335| 334| 333| 332| 331| 330| 329| 328| 327| 326| 325| 324| 323| 322| 321| 320| 319| 318| 317| 316| 315| 314| 313| 312| 311| 310| 309| 308| 307| 306| 305| 304| 303| 302| 301| 300| 299| 298| 297| 296| 295| 294| 293| 292| 291| 290| 289| 288| 287| 286| 285| 284| 283| 282| 281| 280| 279| 278| 277| 276| 275| 274| 273| 272| 271| 270| 269| 268| 267| 266| 265| 264| 263| 262| 261| 260| 259| 258| 257| 256| 255| 254| 253| 252| 251| 250| 249| 248| 247| 246| 245| 244| 243| 242| 241| 240| 239| 238| 237| 236| 235| 234| 233| 232| 231| 230| 229| 228| 227| 226| 225| 224| 223| 222| 221| 220| 219| 218| 217| 216| 215| 214| 213| 212| 211| 210| 209| 208| 207| 206| 205| 204| 203| 202| 201| 200| 199| 198| 197| 196| 195| 194| 193| 192| 191| 190| 189| 188| 187| 186|
185
| 184| 183| 182| 181| 180| 179| 178| 177| 176| 175| 174| 173| 172| 171| 170| 169| 168| 167| 166| 165| 164| 163| 162| 161| 160| 159| 158| 157| 156| 155| 154| 153| 152| 151| 150| 149| 148| 147| 146| 145| 144| 143| 142| 141| 140| 139| 138| 137| 136| 135| 134| 133| 132| 131| 130| 129| 128| 127| 126| 125| 124| 123| 122| 121| 120| 119| 118| 117| 116| 115| 114| 113| 112| 111| 110| 109| 108| 107| 106| 105| 104| 103| 102| 101| 100| 99| 98| 97| 96| 95| 94| 93| 92| 91| 90| 89| 88| 87| 86| 85| 84| 83| 82| 81| 80| 79| 78| 77| 76| 75| 74| 73| 72| 71| 70| 69| 68| 67| 66| 65| 64| 63| 62| 61| 60| 59| 58| 57| 56| 55| 54| 53| 52| 51| 50| 49| 48| 47| 46| 45| 44| 43| 42| 41| 40| 39| 38| 37| 36| 35| 34| 33| 32| 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1|


Home Code Examples Java Forum All Java Tips Books Submit News, Code... Search... Offshore Software Tech Doodling

RSS feed Java FAQ RSS feed Java FAQ News     

    RSS feed Java Forums RSS feed Java Forums

All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest 1999-2006 by Java FAQs Daily Tips.

Interactive software released under GNU GPL, Code Credits, Privacy Policy