Commit 41d41a6a authored by Børge Haugset's avatar Børge Haugset
Browse files

Unntak

parent 88bd551a
package arv;
package uke13.arv;
import java.util.ArrayList;
import java.util.Collection;
......
package arv;
package uke13.arv;
public class Bok {
private String tittel;
private String specialCharacters = " -,.%";
// Vi sjekket først for ulovlige bokstaver, men gikk over til å sjekke for
// lovlige ting: bokstaver, tall og specialCharacters (se over)
private String ulovligeBokstaver = "#¤([]) {]}";
private String ulovligeBokstaver = "#¤([]){]}";
@Override
public String toString() {
// Den første skriver bare ut for bok. Men dersom du lager en
......@@ -24,9 +22,12 @@ public class Bok {
protected String GetToStringAttributes() {
return "tittel=" + tittel; }
public Bok() {
super();
}
public Bok(String tittel) {
// System.out.println("Bok.kons");
setTittel(tittel);
}
......@@ -36,14 +37,22 @@ public class Bok {
public void setTittel(String tittel) {
// System.out.println("Bok.setTittel");
for (int i = 0; i < tittel.length(); i++) {
char c = tittel.charAt(i);
if (! (Character.isLetter(c) || Character.isDigit(c) ||
specialCharacters.indexOf(c) >= 0)) {
return;
}
}
if (!isValidTittel(tittel)) {
if (!isValidTitle(tittel)) {
throw new IllegalArgumentException(tittel+" er ikke en gyldig boktittel.");
}
this.tittel = tittel;
}
public boolean isValidTittel(String tittel) {
public boolean isValidTitle(String tittel) {
// System.out.println("Bok.isValidTittel");
for (int i = 0; i < tittel.length(); i++) {
char c = tittel.charAt(i);
......@@ -55,4 +64,17 @@ public class Bok {
return true;
}
public static void main(String[] args) {
Bok bok = new Bok("Titten tei på eventyr");
System.out.println(bok);
// Sjekk av tittel i setTitle, som kalles i konstruktøren
Bok bok2 = new Bok("Hei{");
System.out.println(bok2); // Vil bli null
// For isValidTitle()
Bok bok3 = new Bok("Titten tei på eventyr @");
// System.out.println(bok3);
}
}
package arv;
package uke13.arv;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ClassGetClass {
public static void main(String[] args) {
public ClassGetClass() {
System.out.println("Jeg er laget!");
}
public static void main(String[] args) {
Class cls;
try {
cls = Class.forName("arv.ClassGetClass");
// Linjen over returnerer _klasseobjektet_, ikke en instans av klassen.
cls = Class.forName("uke13.arv.Bok");
System.out.println("Class found= "+ cls.getName());
System.out.println("Package found= "+ cls.getPackage());
} catch (ClassNotFoundException e) {
System.out.println(e.getLocalizedMessage());
// Det under brukes gjerne i 'reflective programming', som ikke er en viktig ting dette kurset
Method[] methods = cls.getMethods();
for (Method method : methods) {
// System.out.println(method);
}
// Dette under er ikke pensum, men tenker det kan være med å klargjøre hva vi snakker om:
// Vi kan bruke dette til blant annet å instansiere objekter ved kjøretid. Også for 'reflection'
System.out.println("Antall konstruktører i Bok: "+cls.getConstructors().length);
System.out.println("Den første konstruktøren: "+cls.getConstructors()[0]);
Bok bok = (Bok) cls.getConstructors()[0].newInstance("Tittel");
System.out.println("Bok: "+bok);
} catch (ClassNotFoundException | IllegalArgumentException | SecurityException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
......
package uke13.arv;
public class MyObject {
@Override
public String toString() {
return "Hei";
// return super.toString();
}
public static void main(String[] args) {
MyObject mo = new MyObject();
System.out.println(mo);
Object o = new Object();
System.out.println(o.toString());
// Hva gjør den nå?
Object o2 = new MyObject();
System.out.println(o2.toString());
}
}
package arv;
package uke13.arv;
public class NameValidationException extends IllegalArgumentException{
private final Person person;
......@@ -9,6 +9,8 @@ public class NameValidationException extends IllegalArgumentException{
this.illegalName = illegalName;
}
// Merk at vi ikke har noen toString() her. Det har ingen unntak, så vi må helt opp til Throwable
@Override
// Denne skrives ut i catch-metoden i person. Via Throwable sin getLocalizedMessage().
public String getMessage() {
......
package arv;
package uke13.arv;
public class Ordbok extends Bok {
......@@ -33,20 +33,20 @@ public class Ordbok extends Bok {
// System.out.println("Ordbok.setTittel");
if (! isValidTittel(tittel))
if (! isValidTitle(tittel))
throw new IllegalArgumentException(tittel +
" er ikke rett navn på en ordbok");
// this.tittel = tittel; // Men tester en ikke for feil tegn... Da må en:
// this.tittel = tittel; // Men da tester en ikke for feil tegn... Da må en:
super.setTittel(tittel);
}
// isValidTittel overskygger Bok sin, men den sjekker på noe annet...
// isValidTitle overskygger Bok sin, men den sjekker på noe annet...
// Det nye kravet er at en ordbok må slutte på "ordbok". Vi må allikevel
// også huske på å sjekke at den følger super sine krav, så det kan sjekkes først:
public boolean isValidTittel(String tittel) {
public boolean isValidTitle(String tittel) {
// System.out.println("Ordbok.isValidTitle");
if (! super.isValidTittel(tittel)) {
if (! super.isValidTitle(tittel)) {
return false;
}
return tittel.endsWith("ordbok");
......
package arv;
package uke13.arv;
public class Person {
import java.util.ArrayList;
import java.util.Collection;
// Lag den helt vanilla i foil 17, utvid med setName etc i foil 25
// Ta dog med toString i 17
// Legg til equals-sjekk før og etter implementering av equals i Person
public class Person {
private String name;
......@@ -22,14 +20,22 @@ public class Person {
this.name = name;
}
@Override
public String toString() {
return this.getName();
}
@Override
public boolean equals(Object obj) {
return this.toString().equals(obj.toString());
}
// Trenger ikke returnere noe, den utløser unntak hvis den finner noe.
// Unntaket skriver ikke automatisk ut, som sagt på forelesning (overtrøtt...)
// Unntaket skriver ikke automatisk ut, men det
// Det skrives ut der en fanger opp feilen, se catch i main.
private void checkName(final String name) {
for (int i = 0; i < name.length(); i++) {
final char c = name.charAt(i);
// System.out.println("'"+c+"'");
// System.out.println(" .-".indexOf('%'));
if (! (Character.isLetter(c) || " -".indexOf(c) >= 0)) {
throw new NameValidationException(this, name);
}
......@@ -38,15 +44,27 @@ public class Person {
public static void main(final String[] args) {
try {
Person p = new Person("Per Hansen");
Person p2 = new Person("Per@Hansen");
// Lysark 16
Person p = new Person("Per");
System.out.println(p);
// Lysark 18
Collection<Person> c = new ArrayList<>();
c.add(p);
System.out.println(c.contains(new Person("Anne"))); // Nope
System.out.println(c.contains(new Person("Per"))); // Yay, siden alt vi sjekker for likhet er navnet.
// Lysark 21
Person p2 = new Person("Per Berg-Hansen"); // Lovlig grunnet indexOf-sjekken.
Person p3 = new Person("Per@Hansen"); // ulovlig
System.out.println(p.getName());
} catch (final NameValidationException e) {
// Test F3 på getLocalizedMessage under. Da ender du opp på Throwable-klassen.
// Denne igjen kaller getMessage. Den er beskrevet i NameValidationException,
// og som sagt på forelesning vil den overskygge andre getMessage. Dermed skrives
// Denne igjen kaller getMessage(). Den er overskrevet i NameValidationException,
// som da vil skygge over Throwableklassen sin getMessage(). På den måten skrives
// den ut. Se foil 25 om arv.
System.out.println(e.getLocalizedMessage());
System.out.println("Feil: "+e.getLocalizedMessage());
}
}
......
package arv;
public class Point {
double x,y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public Point(double x, double y) {
super();
this.x = x;
this.y = y;
}
public static void main(String[] args) {
Point p1 = new Point(2.3, 3.4); // x er like, y ikke.
package uke13.arv;
// Records har ingen kostruktører, gettere eller settere.
// Ingen verdier kan endres, det er kun lagring. OG den har
// automatisk likhetskontroll som sjekker alle felt.
public record Point(double x, double y) {
public static void main(String[] args) {
Point p1 = new Point(2.3, 3.4);
Point p2 = new Point(2.3, 3.7);
System.out.println("equal: "+p1.equals(p2));
}
// Records har automatisk sjekk av likhet for alle felt
System.out.println("equal: "+p1.equals(p2));
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(x);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
// Men dersom alle felt er like...
Point p3 = new Point(2.3, 3.4);
System.out.println("equal: "+p1.equals(p3));
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
// Vi sjekker, som sagt på forelesning, bare for verdien av x her:
if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
return false;
return true;
}
}
}
package arv;
package uke13.arv;
public class Tegneseriealbum extends Bok {
......
package arv;
package uke13.arv;
public class UnderstandEquals {
String ting;
String streng;
public UnderstandEquals(String ting) {
this.ting = ting;
this.streng = ting;
}
public static void main(String[] args) {
// Kommentarer for utvidelse nederst
String s1 = new String("Hallo");
String s2 = new String("Hallo");
System.out.println(s1.equals(s2));
UnderstandEquals u1 = new UnderstandEquals("Hallo");
UnderstandEquals u2 = new UnderstandEquals("Hallo");
System.out.println(u1.equals(u2));
System.out.println(u1);
System.out.println(u2);
String s1 = new String("Hallo");
String s2 = new String("Hallo");
System.out.println(s1.equals(s2));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((ting == null) ? 0 : ting.hashCode());
return result;
}
UnderstandEquals u1 = new UnderstandEquals("Hallo");
UnderstandEquals u2 = new UnderstandEquals("Hallo");
System.out.println(u1.equals(u2));
System.out.println(u1);
System.out.println(u2);
// Hva skjer hvis jeg lar editoren automatisk lage equals og hashcode?
// Hva skjer med sammenlikning av u1 og u2 når du fjerner denne?
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UnderstandEquals other = (UnderstandEquals) obj;
if (ting == null) {
if (other.ting != null)
return false;
} else if (!ting.equals(other.ting))
return false;
return true;
// Hva skjer hvis jeg overskriver toString?
}
// Prøv å fjerne denne metoden, se hva toString skriver ut da. Jo, Object sin!
@Override
public String toString() {
// Prøv dette for moro skyld:
// System.out.println(super.toString());
return "UnderstandEquals [ting=" + ting + "]";
}
}
package uke13.unntak;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class Feiltyper {
// Diverse feiltyper!
public static void main(String[] args) {
// Nullpointerexception:
// String foo = null;
// int length = foo.length();
// Classcastexception:
// Object i = Integer.valueOf(42);
// String s = (String)i;
// Indexoutofboundserror:
// List<String> ls=new ArrayList<>();
// ls.add("a");
// ls.add("b");
// ls.get(2);
// nosuchelementexception:
// List<String> ls = new ArrayList<>();
// Iterator<String> it = ls.iterator();
// System.out.println(it.next());
// UnsupportedOperationException
// String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
// List<String> flowerList = Arrays.asList(flowers); // Hold musen over asList, den er fixed-size!
// // List<String> flowerList = new ArrayList<>(Arrays.asList(flowers)); // Løsningen
// // For en beskrivelse se feks https://www.javacodexamples.com/examples/why-does-arrays-aslist-return-a-fixed-size-list
// flowerList.add("Celosia");
// flowerList.forEach(System.out::println);
// IllegalArgumentException:
// Map<String, Integer> tempMap = Map.of(
// "Ost", 13,
// "Pølse", 19,
// "Ost", 13, // !
// "Bacalao", 14
// );
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment