Программирование на Java
Шрифт:
public class LegalOne extends BaseClass {
public void method throws IOException {
...
}
}
public class LegalTwo extends BaseClass {
public void method {
...
}
}
public class LegalThree extends BaseClass {
public void method
throws
EOFException,MalformedURLException {
...
}
}
public class IllegalOne extends BaseClass {
public void method
throws
IOException,IllegalAccessException {
...
}
}
public class IllegalTwo extends BaseClass {
public void method {
...
throw
new Exception;
}
}
В
* определение класса LegalOne будет корректным, так как переопределение метода method верное (список ошибок не изменился);
* определение класса LegalTwo будет корректным, так как переопределение метода method верное (новый метод не может выбрасывать ошибок, а значит, не расширяет список возможных ошибок старого метода);
* определение класса LegalThree будет корректным, так как переопределение метода method будет верным (новый метод может создавать исключения, которые являются подклассами исключения, возбуждаемого в старом методе, то есть список сузился);
* определение класса IllegalOne будет некорректным, так как переопределение метода method неверно ( IllegalAccessException не является подклассом IOException, список расширился);
* определение класса IlegalTwo будет некорректным: хотя заголовок method объявлен верно (список не расширился), в теле метода бросается исключение, не указанное в throws.
Особые случаи
Во время исполнения кода могут возникать ситуации, которые почти не описаны в литературе.
Рассмотрим такую ситуацию:
import java.io.*;
public class Test {
public Test {
}
public static void main(String[] args) {
Test test = new Test;
try {
test.doFileInput("bogus.file");
}
catch (IOException ex) {
System.out.println("Second exception handle stack trace");
ex.printStackTrace;
}
}
private String doFileInput(String fileName)
throws FileNotFoundException,IOException {
String retStr = "";
java.io.FileInputStream fis = null;
try {
fis = new java.io.FileInputStream(fileName);
}
catch (FileNotFoundException ex) {
System.out.println("First exception handle stack trace");
ex.printStackTrace;
throw ex;
}
return retStr;
}
}
Результат работы будет выглядеть следующим образом:
java.io.FileNotFoundException: bogus.file (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:33) at experiment.Test.main(Test.java:21) First exception handle stack trace java.io.FileNotFoundException: bogus.file (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:64) at experiment.Test.doFileInput(Test.java:33) at experiment.Test.main(Test.java:21) Second exception handle stack trace
Так
Рассмотрим другой пример:
import java.io.*;
public class Test {
public Test {
}
public static void main(String[] args) {
Test test = new Test;
try {
test.doFileInput;
}
catch (IOException ex) {
System.out.println("Exception hash code " + ex.hashCode);
ex.printStackTrace;
}
}
private String doFileInput
throws FileNotFoundException,IOException {
String retStr = "";
java.io.FileInputStream fis = null; try {
fis = new java.io.FileInputStream("bogus.file");
}
catch (FileNotFoundException ex) {
System.out.println("Exception hash code " + ex.hashCode);
ex.printStackTrace;
fis = new java.io.FileInputStream("anotherBogus.file");
throw ex;
}
return retStr;
}
}
java.io.FileNotFoundException: bogus.file (The system cannot find
the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64)
at experiment.Test.doFileInput(Test.java:33)
at experiment.Test.main(Test.java:21)
Exception hash code 3214658
java.io.FileNotFoundException: anotherBogus.file (The system cannot find
the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:64)
at experiment.Test.doFileInput(Test.java:38)
at experiment.Test.main(Test.java:21)
Exception hash code 6129586
Несложно заметить, что, хотя последовательность вызовов одна и та же, в вызываемом и вызывающем методах обрабатываются разные объекты исключений.