【问题标题】:Java: exception-throwing class?Java:抛出异常的类?
【发布时间】:2011-02-07 14:27:58
【问题描述】:

我有 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);
    }
}

【问题讨论】:

    标签: java exception class error-handling


    【解决方案1】:

    您不能在类定义中抛出异常。您应该在方法定义中抛出异常或使用 try-catch 块。

    【讨论】:

      【解决方案2】:

      throws 关键字不能在类级别应用,只能在方法级别应用。

      【讨论】:

      • 谢谢!没有人提到这一点。
      【解决方案3】:

      类初始化程序(“静态块”)以检查异常终止是编译时错误。

      如果一个类初始化器抛出一个unchecked异常,初始化该类的第一次尝试将引发ExceptionInInitializeError。任何后续尝试使用该类都将导致NoClassDefFoundError。如果您真的想使用异常,请在初始化程序中抛出 RuntimeException 之类的内容。

      但是,问题中显示的方法(在正确初始化类时设置标志)实际上对于许多应用程序来说可能是更好的方法。更具体地说,除非您希望在初始化失败时终止整个程序,否则请使用标志。只需从类声明中删除“throws”子句,因为这不是合法的语法。

      【讨论】:

      • 你可以做的是让 DirReader 类中的每个方法在初始化失败时抛出异常。
      【解决方案4】:

      类不能抛出异常。只有方法可以抛出异常。避免使用基类Exception。抛出一个特定的异常,比如 IllegalStateException 或扩展 Exception 并自己创建。

      【讨论】:

        【解决方案5】:

        您有一个引发异常的静态代码块?如果您确实需要这样做,请抛出 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);        
            }
        
        
        }
        

        【讨论】:

        • RuntimeException 不能从静态初始化块中抛出。你会得到一个编译错误“初始化程序没有正常完成”。
        • 注意抛出RuntimeException会使类加载器抛出异常,类加载相对来说是不可预知的(除非它发生在你使用类之前)。
        • @jonathon 我刚刚尝试了一个在静态初始化程序中抛出 NullPointerException 的类。它编译得很好,但是当我尝试访问它时抛出了 java.lang.ExceptionInInitializerError。在静态初始化程序中抛出异常不是一个好主意
        • @jonathon 这不是真的。当然,您不能有一个保证抛出 RuntimeException 的静态 init 块,但是在静态初始化程序的 catch 块中将已检查的异常转换为未检查的异常是完全可以接受的。
        • 乔纳森,试试我贴的例子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        相关资源
        最近更新 更多