Java: класс исключения? - PullRequest
       12

Java: класс исключения?

12 голосов
/ 13 апреля 2010

У меня есть классы DirReader и Search. Поиск использует DirReader. Я хочу, чтобы поиск знал, когда DirReader выдает исключение. Так, как я могу иметь исключение бросания класса?

В настоящее время я использую 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);
    }
}

Ответы [ 5 ]

30 голосов
/ 13 апреля 2010

Ключевое слово throws нельзя применять на уровне класса, только на уровне метода.

4 голосов
/ 13 апреля 2010

У вас есть блок статического кода, который выдает исключение? Если вам действительно нужно сделать это, выведите 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 голосов
/ 13 апреля 2010

Это ошибка времени компиляции для инициализатора класса («статический блок»), который завершается с проверенным исключением.

Если инициализатор класса выдает исключение unchecked , первая попытка инициализации класса вызовет ExceptionInInitializeError. Любые последующие попытки использовать класс приведут к NoClassDefFoundError. Если вы действительно хотите использовать исключение, добавьте что-то вроде RuntimeException в инициализатор.

Однако подход, показанный в вопросе «установить флаг при правильной инициализации класса», на самом деле может оказаться более подходящим для многих приложений. В частности, я бы сказал, что если вы не хотите, чтобы вся программа завершала работу при сбое инициализации, используйте флаг. Просто удалите предложение throws из объявления класса, потому что это недопустимый синтаксис.

3 голосов
/ 13 апреля 2010

Классы не могут генерировать исключения. Только методы могут генерировать исключения. Избегайте использования базового Exception класса. Создайте конкретное исключение, например IllegalStateException, или продлите Exception и создайте свое собственное.

0 голосов
/ 07 июня 2019

Вы не можете выбросить исключение в определении класса. Вы должны выбросить исключение в определение метода или использовать блок try-catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...