Java - First Impressions for a C++ Programmer

Similar documents
A C++ Class Designer s Checklist

Automating the Testing Oracle

Automating the Testing Oracle

From C++ to Java. Duke CPS

CS321 Languages and Compiler Design I. Winter 2012 Lecture 2

C++_ MARKS 40 MIN

Pointers and References

Lecture Notes CPSC 224 (Spring 2012) Today... Java basics. S. Bowers 1 of 8

Linked Lists. Contents. Steven J. Zeil. July 31, Linked Lists: the Basics 4

Linked Lists. Contents. Steven J. Zeil. July 31, Linked Lists: the Basics 3

Introducing C++ to Java Programmers

C++: Overview and Features

Agenda. The main body and cout. Fundamental data types. Declarations and definitions. Control structures

Lecture 2, September 4

CS 231 Data Structures and Algorithms, Fall 2016

Variables. Data Types.

PIC 20A The Basics of Java

377 Student Guide to C++

CE221 Programming in C++ Part 1 Introduction

Operator Overloading

CS 11 java track: lecture 1

the gamedesigninitiative at cornell university Lecture 7 C++ Overview

Introduction to Programming using C++

CSE 333. Lecture 9 - intro to C++ Hal Perkins Department of Computer Science & Engineering University of Washington

Short Notes of CS201

Linked List using a Sentinel

III. Classes (Chap. 3)

Outline. 1 Function calls and parameter passing. 2 Pointers, arrays, and references. 5 Declarations, scope, and lifetimes 6 I/O

Exceptions, Case Study-Exception handling in C++.

Bruce Merry. IOI Training Dec 2013

CS201 - Introduction to Programming Glossary By

Crash Course in Java. Why Java? Java notes for C++ programmers. Network Programming in Java is very different than in C/C++

Introduction to C++ Professor Hugh C. Lauer CS-2303, System Programming Concepts

Assumptions. History

Sets and MultiSets. Contents. Steven J. Zeil. July 19, Overview of Sets and Maps 4

Intermediate Programming, Spring 2017*

CS3157: Advanced Programming. Outline

Non-numeric types, boolean types, arithmetic. operators. Comp Sci 1570 Introduction to C++ Non-numeric types. const. Reserved words.

Lecture 7. Log into Linux New documents posted to course webpage

Question 0. (1 point) Write the correct ID of the section you normally attend on the cover page of this exam if you have not already done so.

University of Technology. Laser & Optoelectronics Engineering Department. C++ Lab.

The class Object. Lecture CS1122 Summer 2008

Java Intro 3. Java Intro 3. Class Libraries and the Java API. Outline

CS24 Week 3 Lecture 1

CS2141 Software Development using C/C++ C++ Basics

Laboratory 0 Week 0 Advanced Structured Programming An Introduction to Visual Studio and C++

Defensive Programming

Copying Data. Contents. Steven J. Zeil. November 13, Destructors 2

CS102 C++ Exception Handling & Namespaces

The Structure of a C++ Program

CSC Java Programming, Fall Java Data Types and Control Constructs

AN OVERVIEW OF C++ 1

Topic 10: The Java Collections Framework (and Iterators)

CS 240 Data Structure Spring 2018 Exam I 03/01/2018

Chapter 15 - C++ As A "Better C"

21. Exceptions. Advanced Concepts: // exceptions #include <iostream> using namespace std;

COMP322 - Introduction to C++ Lecture 02 - Basics of C++

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 1/9/ Review. Here s a simple C++ program:

a data type is Types

CSE 333 Lecture 9 - intro to C++

CS 315 Software Design Homework 3 Preconditions, Postconditions, Invariants Due: Sept. 29, 11:30 PM

Tirgul 1. Course Guidelines. Packages. Special requests. Inner classes. Inner classes - Example & Syntax

AIMS Embedded Systems Programming MT 2017

Index COPYRIGHTED MATERIAL

C++ for Python Programmers

Getting started with C++ (Part 2)

Classes in C++98 and C++11

Announcements. CSCI 334: Principles of Programming Languages. Lecture 18: C/C++ Announcements. Announcements. Instructor: Dan Barowy

Object Reference and Memory Allocation. Questions:

Chapter 2. Procedural Programming

Increment and the While. Class 15

An overview of Java, Data types and variables

What will happen if we try to compile, link and run this program? Do you have any comments to the code?

A brief introduction to C++

Operator overloading

G52CPP C++ Programming Lecture 17

8. The C++ language, 1. Programming and Algorithms II Degree in Bioinformatics Fall 2017

Unit Testing. Contents. Steven Zeil. July 22, Types of Testing 2. 2 Unit Testing Scaffolding Drivers Stubs...

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Common Misunderstandings from Exam 1 Material

Object-oriented Programming in C++

C++ Basics. Data Processing Course, I. Hrivnacova, IPN Orsay

Computer Science II Lecture 2 Strings, Vectors and Recursion

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 8/19/ Review. Here s a simple C++ program:

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

Data abstractions: ADTs Invariants, Abstraction function. Lecture 4: OOP, autumn 2003

Weiss Chapter 1 terminology (parenthesized numbers are page numbers)

Unit Testing. Steven Zeil. July 22, Types of Testing 2. 2 Unit Testing Scaffolding Drivers Stubs...

Fast Introduction to Object Oriented Programming and C++

Introduction to Java

Basic Principles of OO. Example: Ice/Water Dispenser. Systems Thinking. Interfaces: Describing Behavior. People's Roles wrt Systems

C++ PROGRAMMING LANGUAGE: DYNAMIC MEMORY ALLOCATION AND EXCEPTION IN C++. CAAM 519, CHAPTER 15

Objectives. Chapter 2: Basic Elements of C++ Introduction. Objectives (cont d.) A C++ Program (cont d.) A C++ Program

Chapter 2: Basic Elements of C++

CS 376b Computer Vision

Chapter 2: Basic Elements of C++ Objectives. Objectives (cont d.) A C++ Program. Introduction

C Review. MaxMSP Developers Workshop Summer 2009 CNMAT

Patterns: Working with Arrays

Basic program The following is a basic program in C++; Basic C++ Source Code Compiler Object Code Linker (with libraries) Executable

Lecture 10. Command line arguments Character handling library void* String manipulation (copying, searching, etc.)

Transcription:

Steven Zeil October 25, 2013 Contents 1 Program Structure 3 2 Program Structure == File Structure 6 3 Swimming in Pointers 31 4 Exceptions 34 5 Corresponding Data Structures 38 1

Moving from C++ to Java First, the good news... You already know most of the language * Syntax is largely the same as C++ * Semantics are similar Then, the bad news... The standard libraries of Java and C++ are very, very different I m not going to lecture on the basics You already know most of them Readings from the course Outline page take you to CS382 material do the readings and the labs In this lesson, I ll highlight the differences between Java and C++ that you will need to get started Next lesson, I ll begin focusing on OO issues in Java CS330 2

1 Program Structure Hello Java The traditional starting point: public class HelloWorld public s t a t i c void main ( String [ ] argv ) System. out. println ( "Hello, World! " ) ; Why is main() inside a class? Because Java has no standalone functions. All functions must be inside a class. Any class with a public static void main function taking an array of Strings cane be executed. Class Syntax CS330 3

class MailingList private : struct Node Contact data ; Node* next ; ; Node* f i r s t ; public : MailingList ( ) f i r s t = 0 ;. ; C++ public class MailingList private class Node Contact data ; Node next ; private Node f i r s t ; public MailingList ( ) f i r s t = null ;. Java public and private are labels for each declaration, not names of regions No trailing semi-colon Packages A Java package is like a C++ namespace: A container of classes and other, smaller packages/namespaces C++ Java namespace myutilities class Randomizer. ; ; package myutilities ; class Randomizer. CS330 4

Becomes part of the fully qualified name of a class C++ Java myutilities : : Randomizer r ; myutilities. Randomizer r ; We Can Have Short-Cuts C++ using myutilities : : Randomizer. Randomizer r ; Java import myutilities. Randomizer ;. Randomizer r ; We Can Have Shorter Short-Cuts C++ Java using namespace myutilities ;. Randomizer r ; import myutilities. * ;. Randomizer r ; Cultural Difference C++ programmers rarely invent their own namespaces CS330 5

And use using to circumvent std:: Java programmers frequently invent packages Often multiple packages in a single project Leaving things in the untitled default package is considered the sign of a beginner 2 Program Structure == File Structure Class == File In C++, I can put a class MailingList in student.h and automobile.cpp if I want Not so in Java: A class named Foo must be placed in a file named Foo.java And upper/lower case do count! Classes are not Split into Two Files C++ distinguishes between class declarations: usually placed in a header (.h file), #ifndef MAILINGLIST_H #define MAILINGLIST_H #include <iostream> #include <string> CS330 6

#include "contact.h" A collection of names and addresses class MailingList public: MailingList(); MailingList(const MailingList&); ~MailingList(); const MailingList& operator= (const MailingList&); // Add a new contact to the list void addcontact (const Contact& contact); // Remove one matching contact void removecontact (const Contact&); void removecontact (const Name&); // Find and retrieve contacts bool contains (const Name& name) const; Contact getcontact (const Name& name) const; // combine two mailing lists void merge (const MailingList& otherlist); CS330 7

// How many contacts in list? int size() const; bool operator== (const MailingList& right) const; bool operator< (const MailingList& right) const; private: struct ML_Node Contact contact; ML_Node* next; ML_Node (const Contact& c, ML_Node* nxt) : contact(c), next(nxt) ; int thesize; ML_Node* first; ML_Node* last; // helper functions void clear(); void remove (ML_Node* previous, ML_Node* current); friend std::ostream& operator<< (std::ostream& out, const MailingList& addr); ; // print list, sorted by Contact std::ostream& operator<< (std::ostream& out, const MailingList& list); CS330 8

#endif and definitions: usually placed in a compilation unit (.cpp file) #include <cassert> #include <iostream> #include <string> #include <utility> #include "mailinglist.h" using namespace std; using namespace rel_ops; MailingList::MailingList() : first(null), last(null), thesize(0) MailingList::MailingList(const MailingList& ml) : first(null), last(null), thesize(0) for (ML_Node* current = ml.first; current!= NULL; current = current->next) addcontact(current->contact); CS330 9

MailingList::~MailingList() clear(); const MailingList& MailingList::operator= (const MailingList& ml) if (this!= &ml) clear(); for (ML_Node* current = ml.first; current!= NULL; current = current->next) addcontact(current->contact); return *this; // Add a new contact to the list void MailingList::addContact (const Contact& contact) if (first == NULL) // add to empty list first = last = new ML_Node(contact, NULL); thesize = 1; else if (contact > last->contact) // add to end of non-empty list last->next = new ML_Node(contact, NULL); last = last->next; CS330 10

++thesize; else if (contact < first->contact) // add to front of non-empty list first = new ML_Node(contact, first); ++thesize; else // search for place to insert ML_Node* previous = first; ML_Node* current = first->next; assert (current!= NULL); while (contact < current->contact) previous = current; current = current->next; assert (current!= NULL); previous->next = new ML_Node(contact, current); ++thesize; // Remove one matching contact void MailingList::removeContact (const Contact& contact) ML_Node* previous = NULL; ML_Node* current = first; while (current!= NULL && contact > current->contact) CS330 11

previous = current; current = current->next; if (current!= NULL && contact == current->contact) remove (previous, current); void MailingList::removeContact (const Name& name) ML_Node* previous = NULL; ML_Node* current = first; while (current!= NULL && name > current->contact.getname()) previous = current; current = current->next; if (current!= NULL && name == current->contact.getname()) remove (previous, current); // Find and retrieve contacts bool MailingList::contains (const Name& name) const ML_Node* current = first; while (current!= NULL && name > current->contact.getname()) CS330 12

previous = current; current = current->next; return (current!= NULL && name == current->contact.getname()); Contact MailingList::getContact (const Name& name) const ML_Node* current = first; while (current!= NULL && name > current->contact.getname()) previous = current; current = current->next; if (current!= NULL && name == current->contact.getname()) return current->contact; else return Contact(); // combine two mailing lists void MailingList::merge (const MailingList& anotherlist) CS330 13

// For a quick merge, we will loop around, checking the // first item in each list, and always copying the smaller // of the two items into result MailingList result; ML_Node* thislist = first; const ML_Node* otherlist = anotherlist.first; while (thislist!= NULL and otherlist!= NULL) if (thislist->contact < otherlist->contact) result.addcontact(thislist->contact); thislist = thislist->next; else result.addcontact(otherlist->contact); otherlist = otherlist->next; // Now, one of the two lists has been entirely copied. // The other might still have stuff to copy. So we just copy // any remaining items from the two lists. Note that one of these // two loops will execute zero times. while (thislist!= NULL) result.addcontact(thislist->contact); thislist = thislist->next; while (otherlist!= NULL) CS330 14

result.addcontact(otherlist->contact); otherlist = otherlist->next; // Now result contains the merged list. Transfer that into this list. clear(); first = result.first; last = result.last; thesize = result.thesize; result.first = result.last = NULL; result.thesize = 0; // How many contacts in list? int MailingList::size() const return thesize; bool MailingList::operator== (const MailingList& right) const if (thesize!= right.thesize) // (easy test first!) return false; else const ML_Node* thislist = first; const ML_Node* otherlist = right.first; while (thislist!= NULL) if (thislist->contact!= otherlist->contact) return false; CS330 15

thislist = thislist->next; otherlist = otherlist->next; return true; bool MailingList::operator< (const MailingList& right) const if (thesize < right.thesize) return true; else const ML_Node* thislist = first; const ML_Node* otherlist = right.first; while (thislist!= NULL) if (thislist->contact < otherlist->contact) return true; else if (thislist->contact > otherlist->contact) return false; thislist = thislist->next; otherlist = otherlist->next; return false; // helper functions CS330 16

void MailingList::clear() ML_Node* current = first; while (current!= NULL) ML_Node* next = current->next; delete current; current = next; first = last = NULL; thesize = 0; void MailingList::remove (MailingList::ML_Node* previous, MailingList::ML_Node* current) if (previous == NULL) // remove front of list first = current->next; if (last == current) last = NULL; delete current; else if (current == last) // remove end of list last = previous; last->next = NULL; delete current; else CS330 17

// remove interior node previous->next = current->next; delete current; --thesize; // print list, sorted by Contact std::ostream& operator<< (std::ostream& out, const MailingList& list) MailingList::ML_Node* current = list.first; while (current!= NULL) out << current->contact << "\n"; current = current->next; out << flush; return out; book1.settitle( bogus title ); assert (book1.gettitle() == bogus title ); book2 = book1; assert (book1 == book2); book1.settitle( bogus title 2 ); assert (! (book1 == book2)); CS330 18

catalog.add(book1); assert (catalog.firstbook() == book1);> string s1, s2; cin >> s1 >> s2; if (s1 < s2) abc < def abc < abcd x y Exactly one of the following is true for any x and y x == y x < y y < x namespace std namespace relops template <class T> bool operator!= (T left, T right) return!(left == right); template <class T> bool operator> (T left, T right) CS330 19

return (right < left); using namespace std::relops; Java puts the entire class into one file package mailinglist; * A collection of names and addresses public class MailingList implements Cloneable * Create an empty mailing list * public MailingList() first = null; last = null; thesize = 0; * Add a new contact to the list * @param contact new contact to add public void addcontact(contact contact) if (first == null) CS330 20

// add to empty list first = last = new ML_Node(contact, null); thesize = 1; else if (contact.compareto(last.contact) > 0) // add to end of non-empty list last.next = new ML_Node(contact, null); last = last.next; ++thesize; else if (contact.compareto(first.contact) < 0) // add to front of non-empty list first = new ML_Node(contact, first); ++thesize; else // search for place to insert ML_Node previous = first; ML_Node current = first.next; assert (current!= null); while (contact.compareto(current.contact) < 0) previous = current; current = current.next; assert (current!= null); previous.next = new ML_Node(contact, current); ++thesize; * Remove one matching contact * @param c remove a contact equal to c CS330 21

public void removecontact(contact c) ML_Node previous = null; ML_Node current = first; while (current!= null && c.compareto(current.contact) > 0) previous = current; current = current.next; if (current!= null && c.equals(current.contact)) remove(previous, current); * Remove a contact with the indicated name * @param name name of contact to remove public void removecontact(string name) ML_Node previous = null; ML_Node current = first; while (current!= null && name.compareto(current.contact.getname()) > 0) previous = current; current = current.next; if (current!= null && name == current.contact.getname()) remove(previous, current); * Search for contacts * @param name name to search for * @return true if a contact with an equal name exists CS330 22

public boolean contains(string name) ML_Node current = first; while (current!= null && name.compareto(current.contact.getname()) > 0) current = current.next; return (current!= null && name == current.contact.getname()); * Search for contacts * @param name name to search for * @return contact with that name if found, null if not found public Contact getcontact(string name) ML_Node current = first; while (current!= null && name.compareto(current.contact.getname()) > 0) current = current.next; if (current!= null && name == current.contact.getname()) return current.contact; else return null; * combine two mailing lists * public void merge(mailinglist anotherlist) // For a quick merge, we will loop around, checking the CS330 23

// first item in each list, and always copying the smaller // of the two items into result MailingList result = new MailingList(); ML_Node thislist = first; ML_Node otherlist = anotherlist.first; while (thislist!= null && otherlist!= null) if (thislist.contact.compareto(otherlist.contact) < 0) result.addcontact(thislist.contact); thislist = thislist.next; else result.addcontact(otherlist.contact); otherlist = otherlist.next; // Now, one of the two lists has been entirely copied. // The other might still have stuff to copy. So we just copy // any remaining items from the two lists. Note that one of these // two loops will execute zero times. while (thislist!= null) result.addcontact(thislist.contact); thislist = thislist.next; while (otherlist!= null) result.addcontact(otherlist.contact); otherlist = otherlist.next; // Now result contains the merged list. Transfer that into this list. first = result.first; last = result.last; thesize = result.thesize; CS330 24

* How many contacts in list? public int size() return thesize; * Return true if mailing lists contain equal contacts public boolean equals(object anotherlist) MailingList right = (MailingList) anotherlist; if (thesize!= right.thesize) // (easy test first!) return false; else ML_Node thislist = first; ML_Node otherlist = right.first; while (thislist!= null) if (!thislist.contact.equals(otherlist.contact)) return false; thislist = thislist.next; otherlist = otherlist.next; return true; public int hashcode() int hash = 0; ML_Node current = first; CS330 25

while (current!= null) hash = 3 * hash + current.hashcode(); current = current.next; return hash; public String tostring() StringBuffer buf = new StringBuffer(""); ML_Node current = first; while (current!= null) buf.append(current.tostring()); current = current.next; if (current!= null) buf.append("\n"); buf.append(""); return buf.tostring(); * Deep copy of contacts public Object clone() MailingList result = new MailingList(); ML_Node current = first; while (current!= null) result.addcontact((contact) current.contact.clone()); current = current.next; return result; CS330 26

private class ML_Node public Contact contact; public ML_Node next; public ML_Node(Contact c, ML_Node nxt) contact = c; next = nxt; private int thesize; private ML_Node first; private ML_Node last; // helper functions private void remove(ml_node previous, ML_Node current) if (previous == null) // remove front of list first = current.next; if (last == current) last = null; else if (current == last) // remove end of list last = previous; last.next = null; else CS330 27

// remove interior node previous.next = current.next; --thesize; Function bodies are written immediately after their declaration To C++ programmers, these look like inline functions Package == Directory In C++, we can put our files into any directory we want, as long as we give the appropriate paths in our compilation commands In Java, all items that belong in package packagename must be stored in a directory filenamepackagename/ Packaging and Compiling 1 Suppose we are building a Java project in ~/jproject. If we have a class public class HelloWorld public s t a t i c void main ( String [ ] argv ) System. out. println ( "Hello, World! " ) ; CS330 28

It would be stored in ~/jproject/helloworld,java. The commands to compile and run this would be cd ~/ j p r o j e c t javac HelloWorld. java java HelloWorld Packaging and Compiling 2 Suppose we are building a Java project in ~/jproject. If we have a class package Foo ; public class HelloWorld public s t a t i c void main ( String [ ] argv ) System. out. println ( "Hello, World! " ) ; It would be stored in ~/jproject/foo/helloworld,java. The commands to compile and run this would be cd ~/ j p r o j e c t javac Foo/ HelloWorld. java java Foo. HelloWorld CS330 29

Packaging and Compiling 3 Suppose we are building a Java project in ~/jproject. If we have a class package Foo. Bar ; public class HelloWorld public s t a t i c void main ( String [ ] argv ) System. out. println ( "Hello, World! " ) ; It would be stored in ~/jproject/foo/bar/helloworld,java. The commands to compile and run this would be cd ~/ j p r o j e c t javac Foo/Bar/ HelloWorld. java java Foo. Bar. HelloWorld Is Java Just Trying to Be Annoying? Actually, no. To compile a C++ program, we have to give explicit paths to each compilation unit in our compilation commands and we need to #include each header, giving the correct path to it. The Java compiler finds the source code of our other classes that we use by looking at the fully qualified name (e.g., MyUtilities.Randomizer, or our import statements CS330 30

It just follows the package/class names to find the directory and file in which the rest of our code is located. At run time, the loader acts similarly to find our compiled code. 3 Swimming in Pointers Primitives are Familiar int, long, float, double boolean, not bool char is 16 bits, not 8, to permit the use of Unicode Variables of these types behave as you would expect int x = 2 ; int y = x ; ++x ; System. out. println ( "x=" + x + " y=" + y ) ; prints x=3 y=2 Everything Else is a Pointer void foo ( java. awt. Point p) p. x = 1 ; java. awt. Point w = p ; w. x = 2 ; System. out. println ( "p. x=" + p. x + " w. x=" + w. x ) ; CS330 31

prints p.x=2 w.x=2 Why did p.x change value? Because p and w are references (pointers), so java. awt. Point w = p ; causes w to point to the same value that p does. Lots of Allocation Because all new class variables are really pointers, all new class values have to be created on the heap: C++ Java Point p ( 1, 2 ) ; Point p = new Point ( 1, 2 ) ; Arrays of Pointers C++ programmers need to be particularly careful dealing with arrays: C++ int a [ 1 0 ] ; Point * p = new Point [ 1 0 ] ; int [ ] b = new int [ 1 0 ] ; Point q = new Point [ 1 0 ] ; for ( int i = 0 ; i < q. length ; ++ i ) q [ i ] = new Point ( ) ; Without the loop, q would actually be an array of null pointers. Java CS330 32

Because there are so many pointers Sharing in Java is much more common than copying If you do need a distinct copy, use the clone() function * We ll see later that this is a standard function on all Java objects It s a good thing that Java features automatic garbage collection! Beware of == The == operator works like you would expect on primitives int x = 23; int y = 23; i f ( x == y ) System. out. println ( "Of course! " ) ; But for class objects, == is comparing addresses: Point p = new Point ( 1, 2 ) ; Point q = new Point ( 1, 2 ) ; i f (p == q) System. out. println ( "Not gonna happen" ) ; else System. out. println ( " Surprise! " ) ; CS330 33

equals To compare objects to see if they have the same contents, use the equals function: Point p = new Point ( 1, 2 ) ; Point q = new Point ( 1, 2 ) ; i f (p. equals (q ) ) System. out. println ( "That s better. " ) ; else System. out. println ( "Pay no attention... " ) ; 4 Exceptions Exceptions An exception is a run-time error signal. It may be signalled (thrown) by the underlying runtime system... or by programmer-suppled code Programs can catch exceptions and handle them... or let them go and allow the program to abort Playing Catch Try compiling and (if successful), running each of the following: import java.io.*; Demo of a program that may throw exceptions. CS330 34

@param argv The name of a file to open for input public class OpenFile1 Attempt to open a file static void openfile (String filename) FileReader reader = new FileReader(fileName); Attempt to open the file whose name is given in the first command line parmaeter public static void main (String[] argv) String filename = argv[1]; openfile (filename); import java.io.*; Demo of a program that may throw exceptions. @param argv The name of a file to open for input public class OpenFile2 Attempt to open a file CS330 35

static void openfile (String filename) throws java.io.filenotfoundexception FileReader reader = new FileReader(fileName); Attempt to open the file whose name is given in the first command line parmaeter public static void main (String[] argv) String filename = argv[0]; openfile (filename); import java.io.*; Demo of a program that may throw exceptions. @param argv The name of a file to open for input public class OpenFile3 Attempt to open a file static void openfile (String filename) throws java.io.filenotfoundexception CS330 36

FileReader reader = new FileReader(fileName); Attempt to open the file whose name is given in the first command line parmaeter public static void main (String[] argv) try openfile (argv[0]); catch (java.io.filenotfoundexception ex) System.err.println ("Something is wrong with the file: " + ex); System.out.println ("All done"); using both the names of exiting and non-exiting files, or no name at all. Unchecked Exceptions Exceptions come in two main kinds: checked and unchecked unchecked exceptions could arise almost anywhere e.g., NullPointerException, ArrayIndexOutOfBoundsException functions need not declare that they might throw these CS330 37

Checked Exceptions checked exceptions are more specialized include all programmer-defined exceptions functions must declare if they can throw these Another Cultural Difference C++ actually has exceptions as well. Same throw and try - catch syntax Can t declare what exceptions a function is known to throw But they are used much more widely in Java 5 Corresponding Data Structures The Java API The Java API is huge, but well documented Focus initially on packages java.lang, java.io, and java.util BTW, You can use the javadoc to generate the same kind of documentation for your own code. Example CS330 38

Strings C++ std::string : Java java.lang.string Strings in Java are immutable You cannot change the contents of a string value But you can compute a slightly different value and make a string variable point to the different value s t r i n g s =... ; s [ s. s i z e ( ) / 2 ] = b ; s = s + s ; C++ Java String s =... ; s = s. substring ( 0, s. length ( ) / 2 ) + b + s. substring ( s. length ( ) / 2 + 1 ) ; s = s + s ; If You Need to Change a Java String use a StringBuilder StringBuilder sb = new StringBuilder ( ) ; String line = input. readline ( ) ; while ( l i n e!= null ) sb. append( l i n e ) ; sb. append( "\n" ) ; line = input. readline ( ) ; String allthetext = sb. tostring ( ) ; vector : ArrayList CS330 39 C++

vector <string > v ; v. push_back ( "foo" ) ; cout << v [ 0 ] << endl Java ArrayList <String > v = new ArrayList <String > ( ) ; v. add ( "foo" ) ; System. out. println ( v. get ( 0 ) ) ; list : LinkedList C++ l i s t <string > L ; L. push_back ( "foo" ) ; cout << L. front ( ) << endl Java LinkedList <String > L = new LinkedList <String > ( ) ; L. add ( "foo" ) ; System. out. println ( L. g e t F i r s t ( ) ) ; CS330 40

set : HashSet C++ set <string > s ; s. i n s e r t ( "foo" ) ; cout << s. count ( "foo" ) << endl Java HashSet<String > S = new HashSet<String > ( ) ; S. add( "foo" ) ; System. out. println ( "" + S. contains ( "foo" ) ) ; map : HashMap C++ map<string, int > zip ; zip [ "ODU" ] = 23529; cout << zip [ "ODU" ] << endl Java HashMap<String, Integer > zip = new HashMap<String, Integer > ( ) ; zip. put ( "ODU", 23529); System. out. println ( zip. get ( "ODU" ) ) ; CS330 41