CS 318 - Week 6 Lab - 2-25-13 ...edited version of the projected DrJava Interactions window from lab Welcome to DrJava. Working directory is /Users/smtuttle/humboldt/s13cs318/318labs/318lab06 > int num; > num = 42; > num 42 > num == 42 true > num < 1 false > while (num > 10) { System.out.println("num is: " + num); num -= 10; } num is: 42 num is: 32 num is: 22 num is: 12 > if (num < 10) { System.out.println("num is now: " + num); } num is now: 2 > for (int i=3; i<10; i++) { System.out.println("i is: " + i); } i is: 3 i is: 4 i is: 5 i is: 6 i is: 7 i is: 8 i is: 9 > boolean flag; > flag = true; > flag true > flag = 1; Static Error: Bad types in assignment: from int to boolean > flag == false false > flag == 0 Static Error: Illegal comparison: cannot compare a boolean to a int > flag == "" Static Error: Illegal comparison: cannot compare a boolean to a String > if (1) { System.out.println("won't get here"); } Static Error: Condition must be boolean > // line comment > /* multi > line Static Error: Undefined name 'line' > */ Invalid top level statement // OK, you can't do a multi-line comment in the Interactions // window. But /* and */ do start and end a multi-line // comment in Java! > // relational and boolean operators: > < >= <= == != && || > true && false false > true && 3 Static Error: Bad type in boolean expression > > // ALL Java code is contained in classes > // a Java class that contains a method > // whose signature is: > // public static void main(String args[]) > // is called a Java application, > // and when such an application it executed, > // its action starts with the main method > > // in Java, there is a HIERARCHTY of classes -- > // every class that is not a subclass of another > // class is a subclass of Object > // (note that Java class names are EXPECTED to start > // with an uppercase letter, and be written in > // camel-case (ResultSet)) > // Instances are expected to start with a lowercase > // letter, and be written in camel-case as well > String firstName; > String lastName; > // Only named constants are written with underscores > // to separate "words" -- because they, too, should > // be written in all-uppercase. > // BUT they are TYPICALLY declared using static and final: > > static final int MAX_WIDGETS = 13; Modifier static is not allowed here // OK, maybe not in the DrJava Interactions window -- // but within a class, for a data field, DO usually // make them static (just one copy of that element // no matter how many instances) > final int MAX_WIDGETS = 13; > MAX_WIDGETS 13 > MAX_WIDGETS = 14; Static Error: Variable 'MAX_WIDGETS' cannot be modified > // in Java, the source code for a public class > // MUST be in a file named DesiredClassName.java > // to compile Java at the command-line, > // javac NameOfSourceCodeFile.java > // and the result is a .class bytecode file for > // each class contained within that Java source code > // file (one public class, possibly numerous non-public > // classes // NOTE: a variable whose type is one of the Java primitive // types is a name for a location in memory, like // you are probably used to; // BUT! a variable whose type is a class is really // a REFERENCE -- a pointer! -- to an object of // that class; // AND when first declared, it does NOT yet reference // any instance -- its value, thus, is null! > String name; > name null > import java.sql.*; > // the above says, let me use classes from the package > // java.sql without having to precede their names with > // java.sql. > ResultSet rS; > rS null > name null // and you might remember from C++: can't call a method // of an instance that doesn't exist -- // in Java, you'll get a NullPointerException if you // try that; > name.length() java.lang.NullPointerException > // you'll get this NullPointerException every time you > // try to call a method for a reference not pointing > // at anything -- every time you try to all a method > // for a null reference > if (name != null) { System.out.println("Looky: " + name.length()); } > name = "George"; > name.length() 6 > // but typically, you call a class's constructor to > // create a new instance > name = new String("Sally"); > name "Sally" // by the way, a String literal is indeed an instance // of the String class -- you CAN class String methods // for it; > "Mooooooooo".length() 10 > // Java has a small number of non-object primitive types > // int float double long char boolean > // ...each of these also has a corresponding "wrapper" > // class (Integer Float Double Long Character Boolean) > // for those times when you NEEEED objects! > // ...thanks to autoboxing, often the Java compiler > // helpfully wraps primitives in an wrapper class object > // as needed > > // a Java class has a name, methods, data fields... > // > // if something in a class -- whether a method or data field -- > // is declared to be static, there is ONE copy of > // that method of data field, no matter how many instances > // of the class there are > // The most convenient way to call a static method is to > // use the name of the class (instead of an instance) > // in calling that method > Math.abs(-3) 3 > Math.ceil(2.7) 3.0 > Integer.parseInt("13") 13 > Double.parseDouble("13.77") 13.77 > Integer.parseInt("moo") java.lang.NumberFormatException: For input string: "moo" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Integer.parseInt(Integer.java:499) > Integer.parseInt("13.7") java.lang.NumberFormatException: For input string: "13.7" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:458) at java.lang.Integer.parseInt(Integer.java:499) > Integer.parseInt("13.0") java.lang.NumberFormatException: For input string: "13.0" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:458) at java.lang.Integer.parseInt(Integer.java:499) > Double.parseDouble("45") 45.0 > (double) "45" Static Error: Bad types in cast: from String to double // that Java class Object includes a toString method, // that produces a String depiction of that object -- // all classes inherit that method, although some // override it to create a "nicer" output String // than others... > String s = "123"; > int num > s + num "1230" // what just happened? if one of +'s operand expressions // is a String, Java assumes you want String concatenation, // and tries to call the toString method for the // other operand (with a primitive type instance // being auto-boxed in a wrapper class instance if // necessary)...! > num=456; > num.toString() Static Error: No method in int has name 'toString' > Integer number = new Integer(num); > number 456 > number.toString() "456" > // method names (except for constructors) also start with > // a lowercase letter (constructor names are the same > // as the class, so they are an exception!!) > // data fields are declared INSIDE the class body but > // OUTSIDE of any method -- > // They have scope of the entire class (unless a > // local name overshadows them within some method); > // local variables are those declared inside of a method, > // and their scope is just that method > // SO -- if a name needs to be used in more than 1 method, > // it either needs to be a data field, or you need to pass > // that value as a parameter // WARNING -- note the actual MEANING/SEMANTICS of ==! // it is what you probably expects for primitive // type instances: > int val1; > int val2; > val1=3; > val2=3; > val1==val2 true // BUT -- for references? > String name1; > String name2; > name1="Charlie"; > name2="Charlie"; > name1==name2 false > // with OBJECTS, == is REALLY asking, do these > // two objects reference the SAME object in > // memory? (are they the same address?) > // classes that are comparable for content TEND to > // include a .equals method > name1.equals(name2) true > name2.equals(name1) true > // Note: Java will NOT let you override operators... > > // Java arrays: > // type myArrayName[] = new type[size]; > String names[] = new String[13]; > names { null, null, null, null, null, null, null, null, null, null, null, null, null } > names[0] = "Charlie"; > names { Charlie, null, null, null, null, null, null, null, null, null, null, null, null } > names[1] = "Brown"; > names { Charlie, Brown, null, null, null, null, null, null, null, null, null, null, null } > names[13] = "Sally"; java.lang.ArrayIndexOutOfBoundsException > // Java arrays have a data field length that can be > // used to get their number of elements > names.length 13 // and if an element of an array is an object -- // you can indeed call methods, of course, on that // object: > names[1].length() 5 > names[1] "Brown" > names { Charlie, Brown, null, null, null, null, null, null, null, null, null, null, null } > for (int i=0; i<names.length; i++) { if (names[i] == null) names[i] = "Joe"; } > names { Charlie, Brown, Joe, Joe, Joe, Joe, Joe, Joe, Joe, Joe, Joe, Joe, Joe } > // enhanced for loop as of Java 6: > for (String nextName: names) { System.out.println(nextName); } Charlie Brown Joe Joe Joe Joe Joe Joe Joe Joe Joe Joe Joe > // to CATCH exceptions in Java, use a try-catch > // try > // { > // ...code that MIGHT throw an exception... > // } > // catch (exceptnType exceptnParam) > // { > // ...exception handler for exceptnType... > // } > // catch (exceptnType excpetnParam) > // { > // ... > // } > // note that Exception is a superclass of all exception > // classes, catch that as an "everything else" type thing; > // LIKE PL/SQL, these are ONE WAY -- > // if an exception is thrown in a try-block, > // you LEAVE the try block RIGHT THEN and control > // passes to the FIRST catch with a matching exception-type > // then you do the actions in that catch, and LEAVE the > // try-catch(es) (on to the next statement after the > // last catch) > // for a Java application -- a class with a main method -- > // (that is public, static, void, and expects an array of > // String objects) -- > // you can RUN it using > // java ClassName arg arg arg > > // tip: if you neeeeed a certain number of command line > // arguments, check args.length, that'll give you that > // number then walked through and ran HelloWorld318.java