Java: класс исключения?
У меня есть классы DirReader и Search. Поиск использует DirReader. Я хочу, чтобы поиск знал, когда DirReader выдает исключение. Итак, как я могу исключить класс throwing?
В настоящее время я использую initCorrect -dummy var. Метод стиля исключений может быть более уместным.
Упрощенная ошибка примера
$ javac ExceptionStatic.java
ExceptionStatic.java:4: '{' expected
public class ExceptionStatic throws Exception{
^
1 error
Код
import java.util.*;
import java.io.*;
// THIS PART NEEDS TO BE FIXED:
public class ExceptionStatic throws Exception{
private static boolean initCorrect = false;
public static String hello;
static{
try{
hello = "hallo";
//some other conditionals in real code
if( true) throw new Exception();
initCorrect=true;
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
if(initCorrect)
System.out.println(hello);
}
}
Ответы
Ответ 1
Это ошибка времени компиляции для инициализатора класса ( "статический блок" ) для завершения с проверенным исключением.
Если инициализатор класса выбрасывает исключение, то первая попытка инициализации класса повысит значение ExceptionInInitializeError
. Любые последующие попытки использовать класс вызовут NoClassDefFoundError
. Если вы действительно хотите использовать исключение, введите в инициализатор что-то вроде RuntimeException
.
Однако подход, показанный в вопросе — установка флага при корректном инициализации класса — на самом деле может быть лучшим для многих приложений. В частности, я бы сказал, что, если вы не хотите, чтобы вся программа завершилась, когда произошел сбой инициализации, используйте флаг. Просто удалите предложение "throws" из объявления класса, потому что это не юридический синтаксис.
Ответ 2
Ключевое слово throws
не может применяться на уровне класса, только на уровне метода.
Ответ 3
У вас есть статический блок кода, который генерирует исключение? Если вам действительно нужно сделать это, бросьте RuntimeException
- в противном случае переместите свою логику в метод, связанный с классом DirReader или Search, и создайте эти методы соответствующим Exception
.
Вот пример, который вы можете начать с:
public class test {
static {
try {
method1();
} catch (InterruptedException e) {
throw new RuntimeException();
}
}
protected static void method1() throws InterruptedException {
Thread.sleep(1000);
}
}
Ответ 4
Классы не могут генерировать исключения. Только методы могут генерировать исключения. Избегайте использования базового класса Exception
. Выбросьте конкретное исключение, например IllegalStateException, или добавьте Exception
и создайте свой собственный.
Ответ 5
Вы не можете выбросить исключение в определении класса. Вы должны выбросить свое исключение в определение метода или использовать блок try-catch.