У меня есть классы DirReader и Поиск. Поиск использует DirReader. Я хочу, чтобы поиск знал, когда DirReader выдает исключение. Таким образом, как у меня может быть исключение выдачи класса?
В настоящее время я использую initCorrect - фиктивный 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);
}
}
Это ошибка времени компиляции, когда инициализатор класса ("статический блок") завершает работу с проверенным исключением.
Если инициализатор класса выдает исключение unchecked , первая попытка инициализировать класс вызовет ExceptionInInitializeError
.Любые последующие попытки использовать класс вызовут NoClassDefFoundError
. Если вы действительно хотите использовать исключение, бросьте что-то вроде RuntimeException
в инициализаторе.
Однако подход, показанный в вопросе - установка флага при правильной инициализации класса - на самом деле может быть лучшим для многих приложений. Более конкретно, я бы сказал, что если вы не хотите, чтобы вся программа завершалась при сбое инициализации, используйте флаг. Просто удалите предложение "throws" из объявления класса, потому что это недопустимый синтаксис.
Ключевое слово throws
не может применяться на уровне класса, только на уровне метода.
У вас есть статический блок кода, который вызывает исключение? Если вам действительно нужно это сделать, создайте исключение RuntimeException
- в противном случае переместите вашу логику в метод, связанный с классом DirReader или Search, и пусть эти методы генерируют соответствующее исключение
.
Вот пример, с которого вы можете начать:
public class test {
static {
try {
method1();
} catch (InterruptedException e) {
throw new RuntimeException();
}
}
protected static void method1() throws InterruptedException {
Thread.sleep(1000);
}
}
Классы не могут создавать исключения. Только методы могут вызывать исключения. Избегайте использования базового класса Exception
. Вызовите конкретное исключение, например IllegalStateException, или расширьте Exception
и создайте собственное.