Исключения. Antipatterns. Замена проверки исключением

Содержание

Слайд 2

VI. Исключения 4. Antipatterns

VI. Исключения
4. Antipatterns


Слайд 3

Замена проверки исключением


Замена проверки исключением

Слайд 4

Замена простой проверки public class TestReplacementDemo { public static void main(String[]

Замена простой проверки

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

{
String[] names = { "Harry Hacker", "Tonny Tester", "Eve Engineer" };
long now = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
if (3 < names.length) {
System.out.println(names[3]);
}
}
System.out.println("Time using length check: " + (System.currentTimeMillis() - now) + " ms");
now = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
try {
System.out.println(names[3]);
} catch (ArrayIndexOutOfBoundsException e) {
}
}
System.out.println("Time using exceptions: " + (System.currentTimeMillis() - now) + " ms");
}
}
Time using length check: 141 ms
Time using exceptions: 232765 ms
Слайд 5

Перехватывание и игнорирование


Перехватывание и игнорирование

Слайд 6

Перехватывание и игнорирование public class CatchAndIgnore { public static void main(String[]

Перехватывание и игнорирование

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

{
String[] names = { "I:\\FileIO\\lineFile.txt", "I:\\noSuchDir\\noSuchFile" };
for (String name : names) {
printFirstLine(name);
}
}
private static void printFirstLine(String fileName) {
try {
BufferedReader br = new BufferedReader(new FileReader(fileName));
System.out.print(br.readLine());
}
catch (IOException e) {
}
}
}
Слайд 7

Деструктивная обёртка


Деструктивная обёртка

Слайд 8

class MyException extends RuntimeException { public MyException(String message) { super(message); }


class MyException extends RuntimeException {
public MyException(String message) {
super(message);

}
public MyException(String message, Throwable cause) {
super(message, cause);
}
}
Слайд 9

Деструктивная обёртка public class DestructiveWrappingDemo { public static void main(String[] args)

Деструктивная обёртка

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

String[] names = { "I:\\FileIO\\lineFile.txt", "I:\\noSuchDir\\noSuchFile" };
for (String name : names) {
try {
writeLine(name, "Hello World!");
} catch (IOException e) {
throw new MyException("Hello: something bad has happened ..... ");
}
}
}
private static void writeLine(String fileName, String line)
throws IOException {
Writer wr = new FileWriter(fileName);
wr.write(line);
wr.flush();
}
}
Exception in thread "main" antipatterns.MyException: Hello: something bad has happened .....
at antipatterns.DestructiveWrappingDemo.main(DestructiveWrappingDemo.java:18)
Слайд 10

Недеструктивная обёртка public class DestructiveWrappingDemo { public static void main(String[] args)

Недеструктивная обёртка

public class DestructiveWrappingDemo {
public static void main(String[]

args) {
String[] names = { "I:\\FileIO\\lineFile.txt", "I:\\noSuchDir\\noSuchFile" };
for (String name : names) {
try {
writeLine(name, "Hello World!");
} catch (IOException e) {
throw new MyException("Hello: something bad has happened ..... ", e);
}
}
}
private static void writeLine(String fileName, String line)
throws IOException {
Writer wr = new FileWriter(fileName);
wr.write(line);
wr.flush();
}
}
Exception in thread "main" antipatterns.MyException: Hello: something bad has happened .....
at antipatterns.DestructiveWrappingDemo.main(DestructiveWrappingDemo.java:19)
Caused by: java.io.FileNotFoundException: I:\noSuchDir\noSuchFile (The system cannot find the path specified)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(Unknown Source)
at java.io.FileOutputStream.(Unknown Source)
at java.io.FileWriter.(Unknown Source)
at antipatterns.DestructiveWrappingDemo.writeLine(DestructiveWrappingDemo.java:27)
at antipatterns.DestructiveWrappingDemo.main(DestructiveWrappingDemo.java:16)
Слайд 11

Перехватывание и возвращение null


Перехватывание и возвращение null

Слайд 12

Возвращение null public class CatchReturnNull { public static void main(String[] args)

Возвращение null

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

line = readFirstLine("I:\\noSuchDir\\noSuchFile");
if (line == null) {
System.out.println("File is empty");
}
else {
System.out.println("First line in file: " + line);
}
}
private static String readFirstLine(String fileName) {
try {
BufferedReader br = new BufferedReader(new FileReader(fileName));
return br.readLine();
}
catch (IOException e) {
return null;
}
}
}
File is empty
Слайд 13

Возвращение null для неподдерживаемой операции


Возвращение null для неподдерживаемой операции

Слайд 14

Возвращение null public class UnsupOpReturnNull { public static void main(String[] args)

Возвращение null

public class UnsupOpReturnNull {
public static void main(String[] args) {
SingletonStringMap map=

new SingletonStringMap("firstName", "Alice");
System.out.println(map);
map.put("lastName", "Coder");
System.out.println(map.get("lastName").trim());
}
}
class SingletonStringMap {
private final String k;
private final String v;
SingletonStringMap(String key, String value) {
k = key;
v = value;
}
public int size() {return 1;}
public boolean isEmpty() {return false;}
public boolean containsKey(Object key) {return eq(key, k);}
public boolean containsValue(Object value) {return eq(value, v);}
public String get(String key) {return (eq(key, k) ? v : null);}
public String put(String key, String value) {return null;}
public String toString() {return "[" + k + "," + v +"]";}
private static boolean eq(Object o1, Object o2) {
return (o1==null ? o2==null : o1.equals(o2));
}
}
Слайд 15

Возвращение null [firstName,Alice] Exception in thread "main" java.lang.NullPointerException at antipatterns.UnsupOpReturnNull.main(UnsupOpReturnNull.java:10)

Возвращение null
[firstName,Alice]
Exception in thread "main" java.lang.NullPointerException
at antipatterns.UnsupOpReturnNull.main(UnsupOpReturnNull.java:10)

Слайд 16

Логирование и перебрасывание


Логирование и перебрасывание

Слайд 17

Логирование и перебрасывание class SomeClass { private static Logger logger =

Логирование и перебрасывание

class SomeClass {
private static Logger logger = Logger.getLogger(SomeClass.class);

public void methodA() throws IOException {
try {
throw new IOException();
} catch (IOException e) {
logger.error("Error!", e);
throw e;
}
}
public void methodB() throws IOException {
try {
methodA();
} catch (IOException e) {
logger.error("Error!", e);
throw e;
}
}
public void methodC() throws IOException {
try {
methodB();
} catch (IOException e) {
logger.error("Error!", e);
System.out.println("Handle Exception here.....");
}
}
}
Слайд 18

Логирование и перебрасывание 0 [main] ERROR antipatterns.SomeClass - Error! java.io.IOException at

Логирование и перебрасывание
0 [main] ERROR antipatterns.SomeClass - Error!
java.io.IOException
at antipatterns.SomeClass.methodA(LogAndRethrowDemo.java:23)
at antipatterns.SomeClass.methodB(LogAndRethrowDemo.java:32)
at antipatterns.SomeClass.methodC(LogAndRethrowDemo.java:41)
at

antipatterns.LogAndRethrowDemo.main(LogAndRethrowDemo.java:13)
0 [main] ERROR antipatterns.SomeClass - Error!
java.io.IOException
at antipatterns.SomeClass.methodA(LogAndRethrowDemo.java:23)
at antipatterns.SomeClass.methodB(LogAndRethrowDemo.java:32)
at antipatterns.SomeClass.methodC(LogAndRethrowDemo.java:41)
at antipatterns.LogAndRethrowDemo.main(LogAndRethrowDemo.java:13)
0 [main] ERROR antipatterns.SomeClass - Error!
java.io.IOException
at antipatterns.SomeClass.methodA(LogAndRethrowDemo.java:23)
at antipatterns.SomeClass.methodB(LogAndRethrowDemo.java:32)
at antipatterns.SomeClass.methodC(LogAndRethrowDemo.java:41)
at antipatterns.LogAndRethrowDemo.main(LogAndRethrowDemo.java:13)
Handle Exception here.....