例如:
class a{
  static int v=f();
  static int f() throws IOException{
     //...
  }
}
这里假设f()中会涉及到文件操作,所以会抛出IOException,上面的代码没法编译通过,提示错误在static int v=f()一行:Unhandled exception...
我当然不希望在f()方法中catch异常,因为有了异常,就应该抛出来,让使用者处理,而不应该“隐瞒”。

解决方案 »

  1.   

    这样的话你的f方法里应该用到一个抛出异常的方法,或者有这样的代码:
    throw new IOException();
      

  2.   

    可能抛出检查性异常
    一定要接收写个TRY语句解决
      

  3.   

    改成
    try {
    static int v=f();
    }
    catch(IOException e){}就行了
      

  4.   

    用这种方法
    static int v;
    static {
    try {
    v=f();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
      

  5.   

    答案是:做不到。因为静态实例变量是由ClassLoader在加载Class的时候完成初始化的,这一加载过程在“系统内部”完成,你的程序得不到这一过程的控制权,所以静态实例变量初始化时,不能抛出异常。提供一个walkaround:
    采用单例模式,将静态实例变量改为实例变量,你就可以在构造实例的时候捕获异常。
      

  6.   

    class a{
      static int v=f();
      static int f() throws IOException{
         //...
      }
    }
    这个是有问题的,你在f()方法中抛出了IOException异常,但是你赋值给v时并没有处理IOException所以编译就通不过,你可以将初始化工作交给另一个Static方法去初始化
    import java.io.IOException;
    public class a {
    static int v;
    static void Begin() throws Exception{
    v=f();
    }
    static int f() throws IOException{
    return 0;
    }
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    }
    }
    当中如果出现异常它将一级一级向上抛,直到java虚拟机.
      

  7.   

    看来我说的不清楚,很多人误会了:例如:
    class a{
      static int v=f();
      static int f() throws IOException{
         //...
      }
    }
    这里假设f()中会涉及到文件操作,所以会抛出IOException,上面的代码没法编译通过,提示错误在static int v=f()一行:Unhandled exception...
    我当然不希望在f()方法中catch异常,因为有了异常,就应该抛出来,让使用者处理,而不应该“隐瞒”。同理,我也不希望在给v赋值时catch异常。所以:
    liujun999999(神仙、妖怪、谢谢) 
    f()里当然有抛出IO异常的代码。sheep219(sheep219) 
    呵呵,多谢,希望我这次说得清初一些了。qq14923349(剑神) 
    你说的检查性异常是什么?有什么特别指出吗?
    我不希望写个try,然后把异常catch而欺骗调用者说一切正常。yingge(盼胖) 
    这虽然编译可能通过,但我不想“隐瞒”异常lxwin01(阿幸)
    这样使用者在使用这个类(的静态变量v)以前,就必须先调用Begin(),这个不必要的限制会个使用者带来很大的麻烦。RainRainbow() 
    呵呵,这样写编译能通过,但我不想“隐瞒”异常jshi123() 
    这是我最不希望的答案,但也许是正确的答案了。
    单例模式确实是好的解决方案,但还是有细微的性能损失的。何况,作为严谨的语法,应该有办法来处理这种问题吧。
      

  8.   

    2个方法
    方法1,同意RainRainbow()的做法
    方法2,把IOException强行转化成RuntimeException
      

  9.   

    zouzhiqiangzzq() 
    没有上了啊,在静态变量初始化时,不让抛异常。
    要能支持这种语法(允许static{}像一个函数一样定义)才行:
    class a{
      static int v;
      static throws IOException{
         v=f();
      }
      static int f() throws IOException{
         //...
      }
    }crazycy(崔毅)
    嗯,我现在用的就是方法2,只不过觉得比较晕。
    另外,jshi123()说的单例模式也算一个解决办法。